From: Radek Czajka Date: Fri, 26 Apr 2013 14:29:40 +0000 (+0200) Subject: Merge branch 'master' into funding X-Git-Url: https://git.mdrn.pl/wolnelektury.git/commitdiff_plain/cda147aa999b09a14dacb097d91638f6b9cca236?hp=a06e9d248d2e085d9d071db24bc8cc1aa6dc8ed5 Merge branch 'master' into funding --- diff --git a/.gitignore b/.gitignore index c3e3e48b6..6714e2301 100644 --- a/.gitignore +++ b/.gitignore @@ -5,6 +5,7 @@ dev.sqlite *~ *.orig *.log +.sass-cache # Compress output /static diff --git a/apps/funding/__init__.py b/apps/funding/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/apps/funding/admin.py b/apps/funding/admin.py new file mode 100644 index 000000000..b9fc8c97c --- /dev/null +++ b/apps/funding/admin.py @@ -0,0 +1,31 @@ +from django.contrib import admin +from .models import Offer, Perk, Funding, Spent + + +class OfferAdmin(admin.ModelAdmin): + model = Offer + list_display = ['title', 'author', 'target', 'sum', 'is_win', 'start', 'end', 'due'] + search_fields = ['title', 'author'] + + +class PerkAdmin(admin.ModelAdmin): + model = Perk + list_display = ['name', 'price', 'end_date', 'offer'] + + +class FundingAdmin(admin.ModelAdmin): + model = Funding + list_display = ['payed_at', 'offer', 'amount', 'name', 'email'] + search_fields = ['name', 'email', 'offer__title', 'offer__author'] + + +class SpentAdmin(admin.ModelAdmin): + model = Spent + list_display = ['book', 'amount', 'timestamp'] + search_fields = ['book__title'] + + +admin.site.register(Offer, OfferAdmin) +admin.site.register(Perk, PerkAdmin) +admin.site.register(Funding, FundingAdmin) +admin.site.register(Spent, SpentAdmin) diff --git a/apps/funding/forms.py b/apps/funding/forms.py new file mode 100644 index 000000000..6eba5175b --- /dev/null +++ b/apps/funding/forms.py @@ -0,0 +1,43 @@ +from django import forms +from django.utils.translation import ugettext_lazy as _, ugettext as __ +from .models import Funding +from .widgets import PerksAmountWidget + + +class FundingForm(forms.Form): + required_css_class = 'required' + + amount = forms.DecimalField(label=_("Amount"), decimal_places=2, + widget=PerksAmountWidget()) + name = forms.CharField(label=_("Name"), required=False, + help_text=_("Optional name for public list of contributors.
" + "Leave empty if you prefer to remain anonymous.
" + "If we need any data for your perks, we'll get to you by e-mail anyway.")) + email = forms.EmailField(label=_("Contact e-mail"), + help_text=_("Won't be publicised.
" + "We'll use it to contact you about your perks and fundraiser status and payment updates.
" + "Leave empty if you prefer not to be contacted by us."), required=False) + + def __init__(self, offer, *args, **kwargs): + self.offer = offer + super(FundingForm, self).__init__(*args, **kwargs) + self.fields['amount'].widget.form_instance = self + + def clean_amount(self): + if self.cleaned_data['amount'] <= 0: + raise forms.ValidationError(__("Enter positive amount.")) + return self.cleaned_data['amount'] + + def clean(self): + if not self.offer.is_current(): + raise forms.ValidationError(__("This offer is out of date.")) + return self.cleaned_data + + def save(self): + return Funding.objects.create( + offer=self.offer, + name=self.cleaned_data['name'], + email=self.cleaned_data['email'], + amount=self.cleaned_data['amount'], + ) + diff --git a/apps/funding/locale/pl/LC_MESSAGES/django.mo b/apps/funding/locale/pl/LC_MESSAGES/django.mo new file mode 100644 index 000000000..15d8b9838 Binary files /dev/null and b/apps/funding/locale/pl/LC_MESSAGES/django.mo differ diff --git a/apps/funding/locale/pl/LC_MESSAGES/django.po b/apps/funding/locale/pl/LC_MESSAGES/django.po new file mode 100644 index 000000000..2f7c0c56b --- /dev/null +++ b/apps/funding/locale/pl/LC_MESSAGES/django.po @@ -0,0 +1,348 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# FIRST AUTHOR , YEAR. +# +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2013-04-25 13:01+0200\n" +"PO-Revision-Date: 2013-04-25 13:03+0100\n" +"Last-Translator: Radek Czajka \n" +"Language-Team: LANGUAGE \n" +"Language: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=3; plural=(n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2)\n" + +#: forms.py:10 +#: templates/funding/wlfund.html:28 +msgid "Amount" +msgstr "Kwota" + +#: forms.py:12 +msgid "Name" +msgstr "Imię i nazwisko" + +#: forms.py:13 +msgid "Optional name for public list of contributors.
Leave empty if you prefer to remain anonymous.
If we need any data for your perks, we'll get to you by e-mail anyway." +msgstr "Opcjonalnie imię i nazwisko lub pseudonim do listy darczyńców.
Zostaw puste, jeśli wolisz pozostać anonimową/anonimowym.
Jeśli będziemy potrzebować Twoich danych, by wysłać Ci prezenty, zwrócimy się do Ciebie e-mailem." + +#: forms.py:16 +msgid "Contact e-mail" +msgstr "E-mail kontaktowy" + +#: forms.py:17 +msgid "Won't be publicised.
We'll use it to contact you about your perks and fundraiser status and payment updates.
Leave empty if you prefer not to be contacted by us." +msgstr "Nie będzie publikowany.
Użyjemy go do kontaktu w sprawie prezentów i informacji o zmianach statusu zbiórki i płatności.
Nie wypełniaj, jeśli nie chcesz abyśmy się z Tobą kontaktowali." + +#: models.py:15 +msgid "author" +msgstr "autor" + +#: models.py:16 +msgid "title" +msgstr "tytuł" + +#: models.py:17 +msgid "slug" +msgstr "slug" + +#: models.py:18 +#: models.py:106 +msgid "description" +msgstr "opis" + +#: models.py:19 +msgid "target" +msgstr "kwota docelowa" + +#: models.py:20 +msgid "start" +msgstr "początek" + +#: models.py:21 +msgid "end" +msgstr "koniec" + +#: models.py:22 +msgid "due" +msgstr "data publikacji" + +#: models.py:23 +msgid "When will it be published if the money is raised." +msgstr "Kiedy książka zostanie opublikowana, jeśli uda się zebrać pieniądze." + +#: models.py:24 +msgid "redakcja URL" +msgstr "URL na Redakcji" + +#: models.py:26 +msgid "Published book." +msgstr "Opublikowana książka." + +#: models.py:29 +#: models.py:103 +#: models.py:124 +msgid "offer" +msgstr "zbiórka" + +#: models.py:30 +msgid "offers" +msgstr "zbiórki" + +#: models.py:104 +msgid "price" +msgstr "cena" + +#: models.py:105 +#: models.py:125 +msgid "name" +msgstr "nazwa" + +#: models.py:107 +msgid "end date" +msgstr "data końcowa" + +#: models.py:110 +msgid "perk" +msgstr "prezent" + +#: models.py:111 +#: models.py:129 +msgid "perks" +msgstr "prezenty" + +#: models.py:126 +msgid "email" +msgstr "e-mail" + +#: models.py:127 +#: models.py:156 +msgid "amount" +msgstr "kwota" + +#: models.py:128 +msgid "payed at" +msgstr "data wpłaty" + +#: models.py:139 +msgid "funding" +msgstr "wpłata" + +#: models.py:140 +msgid "fundings" +msgstr "wpłaty" + +#: models.py:157 +msgid "when" +msgstr "kiedy" + +#: models.py:160 +msgid "money spent on a book" +msgstr "pieniądze wydane na książkę" + +#: models.py:161 +msgid "money spent on books" +msgstr "pieniądze wydane na książki" + +#: templates/funding/no_thanks.html:5 +#: templates/funding/no_thanks.html.py:9 +msgid "Payment failed" +msgstr "Płatność nie doszła do skutku" + +#: templates/funding/no_thanks.html:12 +msgid "You're support has not been processed successfully." +msgstr "Twoje wsparcie nie zostało zaksięgowane." + +#: templates/funding/no_thanks.html:17 +#: templates/funding/thanks.html:31 +msgid "Go back to the current fundraiser." +msgstr "Wróć do aktualnej zbiórki." + +#: templates/funding/offer_detail.html:25 +#: templates/funding/thanks.html:28 +#: templates/funding/wlfund.html:17 +msgid "Learn more" +msgstr "Dowiedz się więcej" + +#: templates/funding/offer_detail.html:31 +msgid "Support the publication" +msgstr "Wesprzyj publikację" + +#: templates/funding/offer_detail.html:38 +msgid "Donate!" +msgstr "Wpłać!" + +#: templates/funding/offer_detail.html:46 +#: templates/funding/thanks.html:34 +msgid "Tell your friends!" +msgstr "Powiedz swoim znajomym!" + +#: templates/funding/offer_detail.html:47 +msgid "Support Wolne Lektury!" +msgstr "Wesprzyj Wolne Lektury!" + +#: templates/funding/offer_detail.html:50 +msgid "See all fundraisers." +msgstr "Zobacz wszystkie zbiórki." + +#: templates/funding/offer_detail.html:55 +msgid "Supporters" +msgstr "Wpłaty" + +#: templates/funding/offer_detail.html:69 +msgid "Anonymous" +msgstr "Anonim" + +#: templates/funding/offer_list.html:7 +#: templates/funding/offer_list.html:12 +msgid "All fundraisers" +msgstr "Wszystkie zbiórki" + +#: templates/funding/offer_list.html:20 +msgid "Current fundraiser:" +msgstr "Aktualna zbiórka:" + +#: templates/funding/offer_list.html:22 +#: templates/funding/offer_list.html:37 +msgid "Previous fundraisers:" +msgstr "Poprzednie zbiórki:" + +#: templates/funding/thanks.html:5 +#: templates/funding/thanks.html.py:12 +msgid "Thank you for your support!" +msgstr "Dziękujemy za Twoje wsparcie!" + +#: templates/funding/thanks.html:9 +msgid "Thank you!" +msgstr "Dziękujemy!" + +#: templates/funding/thanks.html:15 +#: templates/funding/tags/offer_status.html:18 +msgid "Full amount was successfully raised!" +msgstr "Udało się zebrać pełną kwotę!" + +#: templates/funding/thanks.html:17 +#: templates/funding/tags/offer_status.html:6 +#, python-format +msgid "" +"The fundraiser\n" +" ends on %(end)s. The book will be published by %(due)s." +msgstr "Zbiórka kończy się %(end)s. Książka zostanie opublikowana do %(due)s." + +#: templates/funding/thanks.html:20 +#, python-format +msgid "" +"Your\n" +" donation will be spent on publishing\n" +" the book %(b)s if the full amount is raised by %(end)s.\n" +" The book will then be published by %(due)s." +msgstr "Pieniądze przez Ciebie wpłacone zostaną przekazane na publikację książki %(b)s, jeśli do %(end)s uda nam się zebrać pełną kwotę potrzebną na digitalizację, redakcję techniczną i literacką. Książka zostanie wówczas opublikowana do %(due)s." + +#: templates/funding/thanks.html:35 +msgid "I support Wolne Lektury." +msgstr "Wspieram Wolne Lektury" + +#: templates/funding/wlfund.html:4 +#: templates/funding/wlfund.html.py:8 +msgid "Remaining funds" +msgstr "Pozostałe środki" + +#: templates/funding/wlfund.html:11 +#, python-format +msgid "" +"If\n" +"the full amount needed for publishing a book is not raised in time,\n" +"the funds are spent on other books waiting for\n" +"publication. The same thing happens with any money remaining\n" +"from successful fundraisers." +msgstr "Jeśli nie udało się zebrać pełnej kwoty potrzebnej do opublikowania książki, środki przekazujemy na redakcję innych utworów oczekujących na publikację w serwisie. Na ten cel przekazujemy również nadmiarowe środki ze zbiórek ukończonych sukcesem." + +#: templates/funding/wlfund.html:19 +msgid "Spending these remaining funds is recorded in this table." +msgstr "W poniższej tabeli rejetrujemy wydatkowanie tych środków." + +#: templates/funding/wlfund.html:26 +msgid "Date" +msgstr "Data" + +#: templates/funding/wlfund.html:27 +msgid "Title" +msgstr "Tytuł" + +#: templates/funding/wlfund.html:29 +msgid "Balance" +msgstr "Bilans" + +#: templates/funding/wlfund.html:36 +msgid "Money spent on publishing the book" +msgstr "Pieniądze przeznaczone na opublikowanie książki" + +#: templates/funding/wlfund.html:45 +msgid "Money remaining from the fundraiser for" +msgstr "Pieniądze pozostałe ze zbiórki na" + +#: templates/funding/snippets/any_remaining.html:3 +#, python-format +msgid "" +"Any remaining funds will be spent\n" +"on other books waiting to be published in the library." +msgstr "Wszelkie pozostałe środki przeznaczymy na inne książki czekające na publikację w serwisie." + +#: templates/funding/tags/funding.html:8 +msgid "Support a book!" +msgstr "Wesprzyj kolejną publikację!" + +#: templates/funding/tags/funding.html:20 +msgid "collected" +msgstr "zebrane" + +#: templates/funding/tags/funding.html:23 +msgid "missing" +msgstr "brakuje" + +#: templates/funding/tags/funding.html:26 +msgid "until fundraiser end" +msgstr "do końca zbiórki" + +#: templates/funding/tags/offer_status.html:11 +#, python-format +msgid "" +"If the target is met\n" +" by %(end)s, this book will be published by %(due)s." +msgstr "Jeśli do %(end)s uda się zebrać pełną kwotę, książka zostanie opublikowana do %(due)s." + +#: templates/funding/tags/offer_status.html:22 +msgid "The amount needed was not raised." +msgstr "Nie udało się zebrać pełnej kwoty." + +#: templates/funding/tags/offer_status_more.html:12 +#, python-format +msgid "" +"The book\n" +" %(bt)s has been already published." +msgstr "" +"Książka\n" +" %(bt)s została opublikowana." + +#: templates/funding/tags/offer_status_more.html:15 +#, python-format +msgid "" +"The book\n" +" will be published by %(due)s." +msgstr "Książka zostanie opublikowana do %(due)s." + +#: templates/funding/tags/offer_status_more.html:18 +#, python-format +msgid "" +"You can follow\n" +" the work on the Editorial Platform." +msgstr "Możesz śledzić prace na Platformie Redakcyjnej." + +#: templates/funding/widgets/amount.html:13 +msgid "Other amount" +msgstr "Inna kwota" + diff --git a/apps/funding/migrations/0001_initial.py b/apps/funding/migrations/0001_initial.py new file mode 100644 index 000000000..924ef7728 --- /dev/null +++ b/apps/funding/migrations/0001_initial.py @@ -0,0 +1,102 @@ +# -*- coding: utf-8 -*- +import datetime +from south.db import db +from south.v2 import SchemaMigration +from django.db import models + + +class Migration(SchemaMigration): + + def forwards(self, orm): + # Adding model 'Offer' + db.create_table('funding_offer', ( + ('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)), + ('author', self.gf('django.db.models.fields.CharField')(max_length=255)), + ('title', self.gf('django.db.models.fields.CharField')(max_length=255)), + ('slug', self.gf('django.db.models.fields.SlugField')(max_length=50)), + ('book_url', self.gf('django.db.models.fields.URLField')(max_length=200, blank=True)), + ('redakcja_url', self.gf('django.db.models.fields.URLField')(max_length=200, blank=True)), + ('target', self.gf('django.db.models.fields.DecimalField')(max_digits=10, decimal_places=2)), + ('start', self.gf('django.db.models.fields.DateField')()), + ('end', self.gf('django.db.models.fields.DateField')()), + )) + db.send_create_signal('funding', ['Offer']) + + # Adding model 'Perk' + db.create_table('funding_perk', ( + ('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)), + ('offer', self.gf('django.db.models.fields.related.ForeignKey')(to=orm['funding.Offer'], null=True)), + ('price', self.gf('django.db.models.fields.DecimalField')(max_digits=10, decimal_places=2)), + ('name', self.gf('django.db.models.fields.CharField')(max_length=255)), + ('description', self.gf('django.db.models.fields.TextField')(blank=True)), + )) + db.send_create_signal('funding', ['Perk']) + + # Adding model 'Funding' + db.create_table('funding_funding', ( + ('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)), + ('offer', self.gf('django.db.models.fields.related.ForeignKey')(to=orm['funding.Offer'])), + ('name', self.gf('django.db.models.fields.CharField')(max_length=127)), + ('email', self.gf('django.db.models.fields.EmailField')(max_length=75)), + ('amount', self.gf('django.db.models.fields.DecimalField')(max_digits=10, decimal_places=2)), + ('payed_at', self.gf('django.db.models.fields.DateTimeField')()), + )) + db.send_create_signal('funding', ['Funding']) + + # Adding M2M table for field perks on 'Funding' + db.create_table('funding_funding_perks', ( + ('id', models.AutoField(verbose_name='ID', primary_key=True, auto_created=True)), + ('funding', models.ForeignKey(orm['funding.funding'], null=False)), + ('perk', models.ForeignKey(orm['funding.perk'], null=False)) + )) + db.create_unique('funding_funding_perks', ['funding_id', 'perk_id']) + + + def backwards(self, orm): + # Deleting model 'Offer' + db.delete_table('funding_offer') + + # Deleting model 'Perk' + db.delete_table('funding_perk') + + # Deleting model 'Funding' + db.delete_table('funding_funding') + + # Removing M2M table for field perks on 'Funding' + db.delete_table('funding_funding_perks') + + + models = { + 'funding.funding': { + 'Meta': {'ordering': "['-payed_at']", 'object_name': 'Funding'}, + 'amount': ('django.db.models.fields.DecimalField', [], {'max_digits': '10', 'decimal_places': '2'}), + 'email': ('django.db.models.fields.EmailField', [], {'max_length': '75'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '127'}), + 'offer': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['funding.Offer']"}), + 'payed_at': ('django.db.models.fields.DateTimeField', [], {}), + 'perks': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['funding.Perk']", 'symmetrical': 'False'}) + }, + 'funding.offer': { + 'Meta': {'ordering': "['-end']", 'object_name': 'Offer'}, + 'author': ('django.db.models.fields.CharField', [], {'max_length': '255'}), + 'book_url': ('django.db.models.fields.URLField', [], {'max_length': '200', 'blank': 'True'}), + 'end': ('django.db.models.fields.DateField', [], {}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'redakcja_url': ('django.db.models.fields.URLField', [], {'max_length': '200', 'blank': 'True'}), + 'slug': ('django.db.models.fields.SlugField', [], {'max_length': '50'}), + 'start': ('django.db.models.fields.DateField', [], {}), + 'target': ('django.db.models.fields.DecimalField', [], {'max_digits': '10', 'decimal_places': '2'}), + 'title': ('django.db.models.fields.CharField', [], {'max_length': '255'}) + }, + 'funding.perk': { + 'Meta': {'ordering': "['-price']", 'object_name': 'Perk'}, + 'description': ('django.db.models.fields.TextField', [], {'blank': 'True'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '255'}), + 'offer': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['funding.Offer']", 'null': 'True'}), + 'price': ('django.db.models.fields.DecimalField', [], {'max_digits': '10', 'decimal_places': '2'}) + } + } + + complete_apps = ['funding'] \ No newline at end of file diff --git a/apps/funding/migrations/0002_auto__add_spent__del_field_offer_book_url__add_field_offer_book.py b/apps/funding/migrations/0002_auto__add_spent__del_field_offer_book_url__add_field_offer_book.py new file mode 100644 index 000000000..1c03bdbf3 --- /dev/null +++ b/apps/funding/migrations/0002_auto__add_spent__del_field_offer_book_url__add_field_offer_book.py @@ -0,0 +1,108 @@ +# -*- coding: utf-8 -*- +import datetime +from south.db import db +from south.v2 import SchemaMigration +from django.db import models + + +class Migration(SchemaMigration): + + def forwards(self, orm): + # Adding model 'Spent' + db.create_table('funding_spent', ( + ('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)), + ('amount', self.gf('django.db.models.fields.DecimalField')(max_digits=10, decimal_places=2)), + ('timestamp', self.gf('django.db.models.fields.DateField')()), + ('book', self.gf('django.db.models.fields.related.ForeignKey')(to=orm['catalogue.Book'])), + )) + db.send_create_signal('funding', ['Spent']) + + # Deleting field 'Offer.book_url' + db.delete_column('funding_offer', 'book_url') + + # Adding field 'Offer.book' + db.add_column('funding_offer', 'book', + self.gf('django.db.models.fields.related.ForeignKey')(to=orm['catalogue.Book'], null=True, blank=True), + keep_default=False) + + + def backwards(self, orm): + # Deleting model 'Spent' + db.delete_table('funding_spent') + + # Adding field 'Offer.book_url' + db.add_column('funding_offer', 'book_url', + self.gf('django.db.models.fields.URLField')(default='', max_length=200, blank=True), + keep_default=False) + + # Deleting field 'Offer.book' + db.delete_column('funding_offer', 'book_id') + + + models = { + 'catalogue.book': { + 'Meta': {'ordering': "('sort_key',)", 'object_name': 'Book'}, + '_related_info': ('jsonfield.fields.JSONField', [], {'null': 'True', 'blank': 'True'}), + 'changed_at': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'db_index': 'True', 'blank': 'True'}), + 'common_slug': ('django.db.models.fields.SlugField', [], {'max_length': '120'}), + 'cover': ('catalogue.fields.EbookField', [], {'max_length': '100', 'null': 'True', 'format_name': "'cover'", 'blank': 'True'}), + 'created_at': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'db_index': 'True', 'blank': 'True'}), + 'description': ('django.db.models.fields.TextField', [], {'blank': 'True'}), + 'epub_file': ('catalogue.fields.EbookField', [], {'default': "''", 'max_length': '100', 'format_name': "'epub'", 'blank': 'True'}), + 'extra_info': ('jsonfield.fields.JSONField', [], {'default': "'{}'"}), + 'fb2_file': ('catalogue.fields.EbookField', [], {'default': "''", 'max_length': '100', 'format_name': "'fb2'", 'blank': 'True'}), + 'gazeta_link': ('django.db.models.fields.CharField', [], {'max_length': '240', 'blank': 'True'}), + 'html_file': ('catalogue.fields.EbookField', [], {'default': "''", 'max_length': '100', 'format_name': "'html'", 'blank': 'True'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'language': ('django.db.models.fields.CharField', [], {'default': "'pol'", 'max_length': '3', 'db_index': 'True'}), + 'mobi_file': ('catalogue.fields.EbookField', [], {'default': "''", 'max_length': '100', 'format_name': "'mobi'", 'blank': 'True'}), + 'parent': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'children'", 'null': 'True', 'to': "orm['catalogue.Book']"}), + 'parent_number': ('django.db.models.fields.IntegerField', [], {'default': '0'}), + 'pdf_file': ('catalogue.fields.EbookField', [], {'default': "''", 'max_length': '100', 'format_name': "'pdf'", 'blank': 'True'}), + 'slug': ('django.db.models.fields.SlugField', [], {'unique': 'True', 'max_length': '120'}), + 'sort_key': ('django.db.models.fields.CharField', [], {'max_length': '120', 'db_index': 'True'}), + 'title': ('django.db.models.fields.CharField', [], {'max_length': '120'}), + 'txt_file': ('catalogue.fields.EbookField', [], {'default': "''", 'max_length': '100', 'format_name': "'txt'", 'blank': 'True'}), + 'wiki_link': ('django.db.models.fields.CharField', [], {'max_length': '240', 'blank': 'True'}), + 'xml_file': ('catalogue.fields.EbookField', [], {'default': "''", 'max_length': '100', 'format_name': "'xml'", 'blank': 'True'}) + }, + 'funding.funding': { + 'Meta': {'ordering': "['-payed_at']", 'object_name': 'Funding'}, + 'amount': ('django.db.models.fields.DecimalField', [], {'max_digits': '10', 'decimal_places': '2'}), + 'email': ('django.db.models.fields.EmailField', [], {'max_length': '75'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '127'}), + 'offer': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['funding.Offer']"}), + 'payed_at': ('django.db.models.fields.DateTimeField', [], {}), + 'perks': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['funding.Perk']", 'symmetrical': 'False', 'blank': 'True'}) + }, + 'funding.offer': { + 'Meta': {'ordering': "['-end']", 'object_name': 'Offer'}, + 'author': ('django.db.models.fields.CharField', [], {'max_length': '255'}), + 'book': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['catalogue.Book']", 'null': 'True', 'blank': 'True'}), + 'end': ('django.db.models.fields.DateField', [], {}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'redakcja_url': ('django.db.models.fields.URLField', [], {'max_length': '200', 'blank': 'True'}), + 'slug': ('django.db.models.fields.SlugField', [], {'max_length': '50'}), + 'start': ('django.db.models.fields.DateField', [], {}), + 'target': ('django.db.models.fields.DecimalField', [], {'max_digits': '10', 'decimal_places': '2'}), + 'title': ('django.db.models.fields.CharField', [], {'max_length': '255'}) + }, + 'funding.perk': { + 'Meta': {'ordering': "['-price']", 'object_name': 'Perk'}, + 'description': ('django.db.models.fields.TextField', [], {'blank': 'True'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '255'}), + 'offer': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['funding.Offer']", 'null': 'True', 'blank': 'True'}), + 'price': ('django.db.models.fields.DecimalField', [], {'max_digits': '10', 'decimal_places': '2'}) + }, + 'funding.spent': { + 'Meta': {'object_name': 'Spent'}, + 'amount': ('django.db.models.fields.DecimalField', [], {'max_digits': '10', 'decimal_places': '2'}), + 'book': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['catalogue.Book']"}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'timestamp': ('django.db.models.fields.DateField', [], {}) + } + } + + complete_apps = ['funding'] \ No newline at end of file diff --git a/apps/funding/migrations/0003_auto__add_field_offer_due.py b/apps/funding/migrations/0003_auto__add_field_offer_due.py new file mode 100644 index 000000000..6f9d352ab --- /dev/null +++ b/apps/funding/migrations/0003_auto__add_field_offer_due.py @@ -0,0 +1,89 @@ +# -*- coding: utf-8 -*- +import datetime +from south.db import db +from south.v2 import SchemaMigration +from django.db import models + + +class Migration(SchemaMigration): + + def forwards(self, orm): + # Adding field 'Offer.due' + db.add_column('funding_offer', 'due', + self.gf('django.db.models.fields.DateField')(default=datetime.datetime(2013, 3, 27, 0, 0)), + keep_default=False) + + + def backwards(self, orm): + # Deleting field 'Offer.due' + db.delete_column('funding_offer', 'due') + + + models = { + 'catalogue.book': { + 'Meta': {'ordering': "('sort_key',)", 'object_name': 'Book'}, + '_related_info': ('jsonfield.fields.JSONField', [], {'null': 'True', 'blank': 'True'}), + 'changed_at': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'db_index': 'True', 'blank': 'True'}), + 'common_slug': ('django.db.models.fields.SlugField', [], {'max_length': '120'}), + 'cover': ('catalogue.fields.EbookField', [], {'max_length': '100', 'null': 'True', 'format_name': "'cover'", 'blank': 'True'}), + 'created_at': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'db_index': 'True', 'blank': 'True'}), + 'description': ('django.db.models.fields.TextField', [], {'blank': 'True'}), + 'epub_file': ('catalogue.fields.EbookField', [], {'default': "''", 'max_length': '100', 'format_name': "'epub'", 'blank': 'True'}), + 'extra_info': ('jsonfield.fields.JSONField', [], {'default': "'{}'"}), + 'fb2_file': ('catalogue.fields.EbookField', [], {'default': "''", 'max_length': '100', 'format_name': "'fb2'", 'blank': 'True'}), + 'gazeta_link': ('django.db.models.fields.CharField', [], {'max_length': '240', 'blank': 'True'}), + 'html_file': ('catalogue.fields.EbookField', [], {'default': "''", 'max_length': '100', 'format_name': "'html'", 'blank': 'True'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'language': ('django.db.models.fields.CharField', [], {'default': "'pol'", 'max_length': '3', 'db_index': 'True'}), + 'mobi_file': ('catalogue.fields.EbookField', [], {'default': "''", 'max_length': '100', 'format_name': "'mobi'", 'blank': 'True'}), + 'parent': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'children'", 'null': 'True', 'to': "orm['catalogue.Book']"}), + 'parent_number': ('django.db.models.fields.IntegerField', [], {'default': '0'}), + 'pdf_file': ('catalogue.fields.EbookField', [], {'default': "''", 'max_length': '100', 'format_name': "'pdf'", 'blank': 'True'}), + 'slug': ('django.db.models.fields.SlugField', [], {'unique': 'True', 'max_length': '120'}), + 'sort_key': ('django.db.models.fields.CharField', [], {'max_length': '120', 'db_index': 'True'}), + 'title': ('django.db.models.fields.CharField', [], {'max_length': '120'}), + 'txt_file': ('catalogue.fields.EbookField', [], {'default': "''", 'max_length': '100', 'format_name': "'txt'", 'blank': 'True'}), + 'wiki_link': ('django.db.models.fields.CharField', [], {'max_length': '240', 'blank': 'True'}), + 'xml_file': ('catalogue.fields.EbookField', [], {'default': "''", 'max_length': '100', 'format_name': "'xml'", 'blank': 'True'}) + }, + 'funding.funding': { + 'Meta': {'ordering': "['-payed_at']", 'object_name': 'Funding'}, + 'amount': ('django.db.models.fields.DecimalField', [], {'max_digits': '10', 'decimal_places': '2'}), + 'email': ('django.db.models.fields.EmailField', [], {'max_length': '75'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '127'}), + 'offer': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['funding.Offer']"}), + 'payed_at': ('django.db.models.fields.DateTimeField', [], {}), + 'perks': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['funding.Perk']", 'symmetrical': 'False', 'blank': 'True'}) + }, + 'funding.offer': { + 'Meta': {'ordering': "['-end']", 'object_name': 'Offer'}, + 'author': ('django.db.models.fields.CharField', [], {'max_length': '255'}), + 'book': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['catalogue.Book']", 'null': 'True', 'blank': 'True'}), + 'due': ('django.db.models.fields.DateField', [], {}), + 'end': ('django.db.models.fields.DateField', [], {}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'redakcja_url': ('django.db.models.fields.URLField', [], {'max_length': '200', 'blank': 'True'}), + 'slug': ('django.db.models.fields.SlugField', [], {'max_length': '50'}), + 'start': ('django.db.models.fields.DateField', [], {}), + 'target': ('django.db.models.fields.DecimalField', [], {'max_digits': '10', 'decimal_places': '2'}), + 'title': ('django.db.models.fields.CharField', [], {'max_length': '255'}) + }, + 'funding.perk': { + 'Meta': {'ordering': "['-price']", 'object_name': 'Perk'}, + 'description': ('django.db.models.fields.TextField', [], {'blank': 'True'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '255'}), + 'offer': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['funding.Offer']", 'null': 'True', 'blank': 'True'}), + 'price': ('django.db.models.fields.DecimalField', [], {'max_digits': '10', 'decimal_places': '2'}) + }, + 'funding.spent': { + 'Meta': {'object_name': 'Spent'}, + 'amount': ('django.db.models.fields.DecimalField', [], {'max_digits': '10', 'decimal_places': '2'}), + 'book': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['catalogue.Book']"}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'timestamp': ('django.db.models.fields.DateField', [], {}) + } + } + + complete_apps = ['funding'] \ No newline at end of file diff --git a/apps/funding/migrations/0004_auto__add_field_funding_anonymous.py b/apps/funding/migrations/0004_auto__add_field_funding_anonymous.py new file mode 100644 index 000000000..d8c4fafbc --- /dev/null +++ b/apps/funding/migrations/0004_auto__add_field_funding_anonymous.py @@ -0,0 +1,90 @@ +# -*- coding: utf-8 -*- +import datetime +from south.db import db +from south.v2 import SchemaMigration +from django.db import models + + +class Migration(SchemaMigration): + + def forwards(self, orm): + # Adding field 'Funding.anonymous' + db.add_column('funding_funding', 'anonymous', + self.gf('django.db.models.fields.BooleanField')(default=False), + keep_default=False) + + + def backwards(self, orm): + # Deleting field 'Funding.anonymous' + db.delete_column('funding_funding', 'anonymous') + + + models = { + 'catalogue.book': { + 'Meta': {'ordering': "('sort_key',)", 'object_name': 'Book'}, + '_related_info': ('jsonfield.fields.JSONField', [], {'null': 'True', 'blank': 'True'}), + 'changed_at': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'db_index': 'True', 'blank': 'True'}), + 'common_slug': ('django.db.models.fields.SlugField', [], {'max_length': '120'}), + 'cover': ('catalogue.fields.EbookField', [], {'max_length': '100', 'null': 'True', 'format_name': "'cover'", 'blank': 'True'}), + 'created_at': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'db_index': 'True', 'blank': 'True'}), + 'description': ('django.db.models.fields.TextField', [], {'blank': 'True'}), + 'epub_file': ('catalogue.fields.EbookField', [], {'default': "''", 'max_length': '100', 'format_name': "'epub'", 'blank': 'True'}), + 'extra_info': ('jsonfield.fields.JSONField', [], {'default': "'{}'"}), + 'fb2_file': ('catalogue.fields.EbookField', [], {'default': "''", 'max_length': '100', 'format_name': "'fb2'", 'blank': 'True'}), + 'gazeta_link': ('django.db.models.fields.CharField', [], {'max_length': '240', 'blank': 'True'}), + 'html_file': ('catalogue.fields.EbookField', [], {'default': "''", 'max_length': '100', 'format_name': "'html'", 'blank': 'True'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'language': ('django.db.models.fields.CharField', [], {'default': "'pol'", 'max_length': '3', 'db_index': 'True'}), + 'mobi_file': ('catalogue.fields.EbookField', [], {'default': "''", 'max_length': '100', 'format_name': "'mobi'", 'blank': 'True'}), + 'parent': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'children'", 'null': 'True', 'to': "orm['catalogue.Book']"}), + 'parent_number': ('django.db.models.fields.IntegerField', [], {'default': '0'}), + 'pdf_file': ('catalogue.fields.EbookField', [], {'default': "''", 'max_length': '100', 'format_name': "'pdf'", 'blank': 'True'}), + 'slug': ('django.db.models.fields.SlugField', [], {'unique': 'True', 'max_length': '120'}), + 'sort_key': ('django.db.models.fields.CharField', [], {'max_length': '120', 'db_index': 'True'}), + 'title': ('django.db.models.fields.CharField', [], {'max_length': '120'}), + 'txt_file': ('catalogue.fields.EbookField', [], {'default': "''", 'max_length': '100', 'format_name': "'txt'", 'blank': 'True'}), + 'wiki_link': ('django.db.models.fields.CharField', [], {'max_length': '240', 'blank': 'True'}), + 'xml_file': ('catalogue.fields.EbookField', [], {'default': "''", 'max_length': '100', 'format_name': "'xml'", 'blank': 'True'}) + }, + 'funding.funding': { + 'Meta': {'ordering': "['-payed_at']", 'object_name': 'Funding'}, + 'amount': ('django.db.models.fields.DecimalField', [], {'max_digits': '10', 'decimal_places': '2'}), + 'anonymous': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'email': ('django.db.models.fields.EmailField', [], {'max_length': '75'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '127'}), + 'offer': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['funding.Offer']"}), + 'payed_at': ('django.db.models.fields.DateTimeField', [], {}), + 'perks': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['funding.Perk']", 'symmetrical': 'False', 'blank': 'True'}) + }, + 'funding.offer': { + 'Meta': {'ordering': "['-end']", 'object_name': 'Offer'}, + 'author': ('django.db.models.fields.CharField', [], {'max_length': '255'}), + 'book': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['catalogue.Book']", 'null': 'True', 'blank': 'True'}), + 'due': ('django.db.models.fields.DateField', [], {}), + 'end': ('django.db.models.fields.DateField', [], {}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'redakcja_url': ('django.db.models.fields.URLField', [], {'max_length': '200', 'blank': 'True'}), + 'slug': ('django.db.models.fields.SlugField', [], {'max_length': '50'}), + 'start': ('django.db.models.fields.DateField', [], {}), + 'target': ('django.db.models.fields.DecimalField', [], {'max_digits': '10', 'decimal_places': '2'}), + 'title': ('django.db.models.fields.CharField', [], {'max_length': '255'}) + }, + 'funding.perk': { + 'Meta': {'ordering': "['-price']", 'object_name': 'Perk'}, + 'description': ('django.db.models.fields.TextField', [], {'blank': 'True'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '255'}), + 'offer': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['funding.Offer']", 'null': 'True', 'blank': 'True'}), + 'price': ('django.db.models.fields.DecimalField', [], {'max_digits': '10', 'decimal_places': '2'}) + }, + 'funding.spent': { + 'Meta': {'object_name': 'Spent'}, + 'amount': ('django.db.models.fields.DecimalField', [], {'max_digits': '10', 'decimal_places': '2'}), + 'book': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['catalogue.Book']"}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'timestamp': ('django.db.models.fields.DateField', [], {}) + } + } + + complete_apps = ['funding'] \ No newline at end of file diff --git a/apps/funding/migrations/0005_auto__chg_field_funding_payed_at.py b/apps/funding/migrations/0005_auto__chg_field_funding_payed_at.py new file mode 100644 index 000000000..bcd4e1e0c --- /dev/null +++ b/apps/funding/migrations/0005_auto__chg_field_funding_payed_at.py @@ -0,0 +1,88 @@ +# -*- coding: utf-8 -*- +import datetime +from south.db import db +from south.v2 import SchemaMigration +from django.db import models + + +class Migration(SchemaMigration): + + def forwards(self, orm): + + # Changing field 'Funding.payed_at' + db.alter_column(u'funding_funding', 'payed_at', self.gf('django.db.models.fields.DateTimeField')(null=True)) + + def backwards(self, orm): + + # Changing field 'Funding.payed_at' + db.alter_column(u'funding_funding', 'payed_at', self.gf('django.db.models.fields.DateTimeField')(default=datetime.datetime(2013, 4, 16, 0, 0))) + + models = { + 'catalogue.book': { + 'Meta': {'ordering': "('sort_key',)", 'object_name': 'Book'}, + '_related_info': ('jsonfield.fields.JSONField', [], {'null': 'True', 'blank': 'True'}), + 'changed_at': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'db_index': 'True', 'blank': 'True'}), + 'common_slug': ('django.db.models.fields.SlugField', [], {'max_length': '120'}), + 'cover': ('catalogue.fields.EbookField', [], {'max_length': '100', 'null': 'True', 'format_name': "'cover'", 'blank': 'True'}), + 'created_at': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'db_index': 'True', 'blank': 'True'}), + 'description': ('django.db.models.fields.TextField', [], {'blank': 'True'}), + 'epub_file': ('catalogue.fields.EbookField', [], {'default': "''", 'max_length': '100', 'format_name': "'epub'", 'blank': 'True'}), + 'extra_info': ('jsonfield.fields.JSONField', [], {'default': "'{}'"}), + 'fb2_file': ('catalogue.fields.EbookField', [], {'default': "''", 'max_length': '100', 'format_name': "'fb2'", 'blank': 'True'}), + 'gazeta_link': ('django.db.models.fields.CharField', [], {'max_length': '240', 'blank': 'True'}), + 'html_file': ('catalogue.fields.EbookField', [], {'default': "''", 'max_length': '100', 'format_name': "'html'", 'blank': 'True'}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'language': ('django.db.models.fields.CharField', [], {'default': "'pol'", 'max_length': '3', 'db_index': 'True'}), + 'mobi_file': ('catalogue.fields.EbookField', [], {'default': "''", 'max_length': '100', 'format_name': "'mobi'", 'blank': 'True'}), + 'parent': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'children'", 'null': 'True', 'to': "orm['catalogue.Book']"}), + 'parent_number': ('django.db.models.fields.IntegerField', [], {'default': '0'}), + 'pdf_file': ('catalogue.fields.EbookField', [], {'default': "''", 'max_length': '100', 'format_name': "'pdf'", 'blank': 'True'}), + 'slug': ('django.db.models.fields.SlugField', [], {'unique': 'True', 'max_length': '120'}), + 'sort_key': ('django.db.models.fields.CharField', [], {'max_length': '120', 'db_index': 'True'}), + 'title': ('django.db.models.fields.CharField', [], {'max_length': '120'}), + 'txt_file': ('catalogue.fields.EbookField', [], {'default': "''", 'max_length': '100', 'format_name': "'txt'", 'blank': 'True'}), + 'wiki_link': ('django.db.models.fields.CharField', [], {'max_length': '240', 'blank': 'True'}), + 'xml_file': ('catalogue.fields.EbookField', [], {'default': "''", 'max_length': '100', 'format_name': "'xml'", 'blank': 'True'}) + }, + u'funding.funding': { + 'Meta': {'ordering': "['-payed_at']", 'object_name': 'Funding'}, + 'amount': ('django.db.models.fields.DecimalField', [], {'max_digits': '10', 'decimal_places': '2'}), + 'anonymous': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'email': ('django.db.models.fields.EmailField', [], {'max_length': '75', 'blank': 'True'}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '127', 'blank': 'True'}), + 'offer': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['funding.Offer']"}), + 'payed_at': ('django.db.models.fields.DateTimeField', [], {'null': 'True', 'blank': 'True'}), + 'perks': ('django.db.models.fields.related.ManyToManyField', [], {'to': u"orm['funding.Perk']", 'symmetrical': 'False', 'blank': 'True'}) + }, + u'funding.offer': { + 'Meta': {'ordering': "['-end']", 'object_name': 'Offer'}, + 'author': ('django.db.models.fields.CharField', [], {'max_length': '255'}), + 'book': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['catalogue.Book']", 'null': 'True', 'blank': 'True'}), + 'due': ('django.db.models.fields.DateField', [], {}), + 'end': ('django.db.models.fields.DateField', [], {}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'redakcja_url': ('django.db.models.fields.URLField', [], {'max_length': '200', 'blank': 'True'}), + 'slug': ('django.db.models.fields.SlugField', [], {'max_length': '50'}), + 'start': ('django.db.models.fields.DateField', [], {}), + 'target': ('django.db.models.fields.DecimalField', [], {'max_digits': '10', 'decimal_places': '2'}), + 'title': ('django.db.models.fields.CharField', [], {'max_length': '255'}) + }, + u'funding.perk': { + 'Meta': {'ordering': "['-price']", 'object_name': 'Perk'}, + 'description': ('django.db.models.fields.TextField', [], {'blank': 'True'}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '255'}), + 'offer': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['funding.Offer']", 'null': 'True', 'blank': 'True'}), + 'price': ('django.db.models.fields.DecimalField', [], {'max_digits': '10', 'decimal_places': '2'}) + }, + u'funding.spent': { + 'Meta': {'ordering': "['-timestamp']", 'object_name': 'Spent'}, + 'amount': ('django.db.models.fields.DecimalField', [], {'max_digits': '10', 'decimal_places': '2'}), + 'book': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['catalogue.Book']"}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'timestamp': ('django.db.models.fields.DateField', [], {}) + } + } + + complete_apps = ['funding'] \ No newline at end of file diff --git a/apps/funding/migrations/0006_auto__del_field_funding_anonymous.py b/apps/funding/migrations/0006_auto__del_field_funding_anonymous.py new file mode 100644 index 000000000..9a059a4d4 --- /dev/null +++ b/apps/funding/migrations/0006_auto__del_field_funding_anonymous.py @@ -0,0 +1,89 @@ +# -*- coding: utf-8 -*- +import datetime +from south.db import db +from south.v2 import SchemaMigration +from django.db import models + + +class Migration(SchemaMigration): + + def forwards(self, orm): + # Deleting field 'Funding.anonymous' + db.delete_column(u'funding_funding', 'anonymous') + + + def backwards(self, orm): + # Adding field 'Funding.anonymous' + db.add_column(u'funding_funding', 'anonymous', + self.gf('django.db.models.fields.BooleanField')(default=False), + keep_default=False) + + + models = { + 'catalogue.book': { + 'Meta': {'ordering': "('sort_key',)", 'object_name': 'Book'}, + '_related_info': ('jsonfield.fields.JSONField', [], {'null': 'True', 'blank': 'True'}), + 'changed_at': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'db_index': 'True', 'blank': 'True'}), + 'common_slug': ('django.db.models.fields.SlugField', [], {'max_length': '120'}), + 'cover': ('catalogue.fields.EbookField', [], {'max_length': '100', 'null': 'True', 'format_name': "'cover'", 'blank': 'True'}), + 'created_at': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'db_index': 'True', 'blank': 'True'}), + 'description': ('django.db.models.fields.TextField', [], {'blank': 'True'}), + 'epub_file': ('catalogue.fields.EbookField', [], {'default': "''", 'max_length': '100', 'format_name': "'epub'", 'blank': 'True'}), + 'extra_info': ('jsonfield.fields.JSONField', [], {'default': "'{}'"}), + 'fb2_file': ('catalogue.fields.EbookField', [], {'default': "''", 'max_length': '100', 'format_name': "'fb2'", 'blank': 'True'}), + 'gazeta_link': ('django.db.models.fields.CharField', [], {'max_length': '240', 'blank': 'True'}), + 'html_file': ('catalogue.fields.EbookField', [], {'default': "''", 'max_length': '100', 'format_name': "'html'", 'blank': 'True'}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'language': ('django.db.models.fields.CharField', [], {'default': "'pol'", 'max_length': '3', 'db_index': 'True'}), + 'mobi_file': ('catalogue.fields.EbookField', [], {'default': "''", 'max_length': '100', 'format_name': "'mobi'", 'blank': 'True'}), + 'parent': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'children'", 'null': 'True', 'to': "orm['catalogue.Book']"}), + 'parent_number': ('django.db.models.fields.IntegerField', [], {'default': '0'}), + 'pdf_file': ('catalogue.fields.EbookField', [], {'default': "''", 'max_length': '100', 'format_name': "'pdf'", 'blank': 'True'}), + 'slug': ('django.db.models.fields.SlugField', [], {'unique': 'True', 'max_length': '120'}), + 'sort_key': ('django.db.models.fields.CharField', [], {'max_length': '120', 'db_index': 'True'}), + 'title': ('django.db.models.fields.CharField', [], {'max_length': '120'}), + 'txt_file': ('catalogue.fields.EbookField', [], {'default': "''", 'max_length': '100', 'format_name': "'txt'", 'blank': 'True'}), + 'wiki_link': ('django.db.models.fields.CharField', [], {'max_length': '240', 'blank': 'True'}), + 'xml_file': ('catalogue.fields.EbookField', [], {'default': "''", 'max_length': '100', 'format_name': "'xml'", 'blank': 'True'}) + }, + u'funding.funding': { + 'Meta': {'ordering': "['-payed_at']", 'object_name': 'Funding'}, + 'amount': ('django.db.models.fields.DecimalField', [], {'max_digits': '10', 'decimal_places': '2'}), + 'email': ('django.db.models.fields.EmailField', [], {'max_length': '75', 'blank': 'True'}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '127', 'blank': 'True'}), + 'offer': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['funding.Offer']"}), + 'payed_at': ('django.db.models.fields.DateTimeField', [], {'null': 'True', 'blank': 'True'}), + 'perks': ('django.db.models.fields.related.ManyToManyField', [], {'to': u"orm['funding.Perk']", 'symmetrical': 'False', 'blank': 'True'}) + }, + u'funding.offer': { + 'Meta': {'ordering': "['-end']", 'object_name': 'Offer'}, + 'author': ('django.db.models.fields.CharField', [], {'max_length': '255'}), + 'book': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['catalogue.Book']", 'null': 'True', 'blank': 'True'}), + 'due': ('django.db.models.fields.DateField', [], {}), + 'end': ('django.db.models.fields.DateField', [], {}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'redakcja_url': ('django.db.models.fields.URLField', [], {'max_length': '200', 'blank': 'True'}), + 'slug': ('django.db.models.fields.SlugField', [], {'max_length': '50'}), + 'start': ('django.db.models.fields.DateField', [], {}), + 'target': ('django.db.models.fields.DecimalField', [], {'max_digits': '10', 'decimal_places': '2'}), + 'title': ('django.db.models.fields.CharField', [], {'max_length': '255'}) + }, + u'funding.perk': { + 'Meta': {'ordering': "['-price']", 'object_name': 'Perk'}, + 'description': ('django.db.models.fields.TextField', [], {'blank': 'True'}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '255'}), + 'offer': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['funding.Offer']", 'null': 'True', 'blank': 'True'}), + 'price': ('django.db.models.fields.DecimalField', [], {'max_digits': '10', 'decimal_places': '2'}) + }, + u'funding.spent': { + 'Meta': {'ordering': "['-timestamp']", 'object_name': 'Spent'}, + 'amount': ('django.db.models.fields.DecimalField', [], {'max_digits': '10', 'decimal_places': '2'}), + 'book': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['catalogue.Book']"}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'timestamp': ('django.db.models.fields.DateField', [], {}) + } + } + + complete_apps = ['funding'] \ No newline at end of file diff --git a/apps/funding/migrations/0007_auto__add_field_perk_end_date.py b/apps/funding/migrations/0007_auto__add_field_perk_end_date.py new file mode 100644 index 000000000..25f15b25d --- /dev/null +++ b/apps/funding/migrations/0007_auto__add_field_perk_end_date.py @@ -0,0 +1,90 @@ +# -*- coding: utf-8 -*- +import datetime +from south.db import db +from south.v2 import SchemaMigration +from django.db import models + + +class Migration(SchemaMigration): + + def forwards(self, orm): + # Adding field 'Perk.end_date' + db.add_column(u'funding_perk', 'end_date', + self.gf('django.db.models.fields.DateField')(null=True, blank=True), + keep_default=False) + + + def backwards(self, orm): + # Deleting field 'Perk.end_date' + db.delete_column(u'funding_perk', 'end_date') + + + models = { + 'catalogue.book': { + 'Meta': {'ordering': "('sort_key',)", 'object_name': 'Book'}, + '_related_info': ('jsonfield.fields.JSONField', [], {'null': 'True', 'blank': 'True'}), + 'changed_at': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'db_index': 'True', 'blank': 'True'}), + 'common_slug': ('django.db.models.fields.SlugField', [], {'max_length': '120'}), + 'cover': ('catalogue.fields.EbookField', [], {'max_length': '100', 'null': 'True', 'format_name': "'cover'", 'blank': 'True'}), + 'created_at': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'db_index': 'True', 'blank': 'True'}), + 'description': ('django.db.models.fields.TextField', [], {'blank': 'True'}), + 'epub_file': ('catalogue.fields.EbookField', [], {'default': "''", 'max_length': '100', 'format_name': "'epub'", 'blank': 'True'}), + 'extra_info': ('jsonfield.fields.JSONField', [], {'default': "'{}'"}), + 'fb2_file': ('catalogue.fields.EbookField', [], {'default': "''", 'max_length': '100', 'format_name': "'fb2'", 'blank': 'True'}), + 'gazeta_link': ('django.db.models.fields.CharField', [], {'max_length': '240', 'blank': 'True'}), + 'html_file': ('catalogue.fields.EbookField', [], {'default': "''", 'max_length': '100', 'format_name': "'html'", 'blank': 'True'}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'language': ('django.db.models.fields.CharField', [], {'default': "'pol'", 'max_length': '3', 'db_index': 'True'}), + 'mobi_file': ('catalogue.fields.EbookField', [], {'default': "''", 'max_length': '100', 'format_name': "'mobi'", 'blank': 'True'}), + 'parent': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'children'", 'null': 'True', 'to': "orm['catalogue.Book']"}), + 'parent_number': ('django.db.models.fields.IntegerField', [], {'default': '0'}), + 'pdf_file': ('catalogue.fields.EbookField', [], {'default': "''", 'max_length': '100', 'format_name': "'pdf'", 'blank': 'True'}), + 'slug': ('django.db.models.fields.SlugField', [], {'unique': 'True', 'max_length': '120'}), + 'sort_key': ('django.db.models.fields.CharField', [], {'max_length': '120', 'db_index': 'True'}), + 'title': ('django.db.models.fields.CharField', [], {'max_length': '120'}), + 'txt_file': ('catalogue.fields.EbookField', [], {'default': "''", 'max_length': '100', 'format_name': "'txt'", 'blank': 'True'}), + 'wiki_link': ('django.db.models.fields.CharField', [], {'max_length': '240', 'blank': 'True'}), + 'xml_file': ('catalogue.fields.EbookField', [], {'default': "''", 'max_length': '100', 'format_name': "'xml'", 'blank': 'True'}) + }, + u'funding.funding': { + 'Meta': {'ordering': "['-payed_at']", 'object_name': 'Funding'}, + 'amount': ('django.db.models.fields.DecimalField', [], {'max_digits': '10', 'decimal_places': '2'}), + 'email': ('django.db.models.fields.EmailField', [], {'max_length': '75', 'blank': 'True'}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '127', 'blank': 'True'}), + 'offer': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['funding.Offer']"}), + 'payed_at': ('django.db.models.fields.DateTimeField', [], {'null': 'True', 'blank': 'True'}), + 'perks': ('django.db.models.fields.related.ManyToManyField', [], {'to': u"orm['funding.Perk']", 'symmetrical': 'False', 'blank': 'True'}) + }, + u'funding.offer': { + 'Meta': {'ordering': "['-end']", 'object_name': 'Offer'}, + 'author': ('django.db.models.fields.CharField', [], {'max_length': '255'}), + 'book': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['catalogue.Book']", 'null': 'True', 'blank': 'True'}), + 'due': ('django.db.models.fields.DateField', [], {}), + 'end': ('django.db.models.fields.DateField', [], {}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'redakcja_url': ('django.db.models.fields.URLField', [], {'max_length': '200', 'blank': 'True'}), + 'slug': ('django.db.models.fields.SlugField', [], {'max_length': '50'}), + 'start': ('django.db.models.fields.DateField', [], {}), + 'target': ('django.db.models.fields.DecimalField', [], {'max_digits': '10', 'decimal_places': '2'}), + 'title': ('django.db.models.fields.CharField', [], {'max_length': '255'}) + }, + u'funding.perk': { + 'Meta': {'ordering': "['-price']", 'object_name': 'Perk'}, + 'description': ('django.db.models.fields.TextField', [], {'blank': 'True'}), + 'end_date': ('django.db.models.fields.DateField', [], {'null': 'True', 'blank': 'True'}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '255'}), + 'offer': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['funding.Offer']", 'null': 'True', 'blank': 'True'}), + 'price': ('django.db.models.fields.DecimalField', [], {'max_digits': '10', 'decimal_places': '2'}) + }, + u'funding.spent': { + 'Meta': {'ordering': "['-timestamp']", 'object_name': 'Spent'}, + 'amount': ('django.db.models.fields.DecimalField', [], {'max_digits': '10', 'decimal_places': '2'}), + 'book': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['catalogue.Book']"}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'timestamp': ('django.db.models.fields.DateField', [], {}) + } + } + + complete_apps = ['funding'] \ No newline at end of file diff --git a/apps/funding/migrations/0008_auto__add_field_offer_description.py b/apps/funding/migrations/0008_auto__add_field_offer_description.py new file mode 100644 index 000000000..265df93e4 --- /dev/null +++ b/apps/funding/migrations/0008_auto__add_field_offer_description.py @@ -0,0 +1,91 @@ +# -*- coding: utf-8 -*- +import datetime +from south.db import db +from south.v2 import SchemaMigration +from django.db import models + + +class Migration(SchemaMigration): + + def forwards(self, orm): + # Adding field 'Offer.description' + db.add_column(u'funding_offer', 'description', + self.gf('django.db.models.fields.TextField')(default='', blank=True), + keep_default=False) + + + def backwards(self, orm): + # Deleting field 'Offer.description' + db.delete_column(u'funding_offer', 'description') + + + models = { + 'catalogue.book': { + 'Meta': {'ordering': "('sort_key',)", 'object_name': 'Book'}, + '_related_info': ('jsonfield.fields.JSONField', [], {'null': 'True', 'blank': 'True'}), + 'changed_at': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'db_index': 'True', 'blank': 'True'}), + 'common_slug': ('django.db.models.fields.SlugField', [], {'max_length': '120'}), + 'cover': ('catalogue.fields.EbookField', [], {'max_length': '100', 'null': 'True', 'format_name': "'cover'", 'blank': 'True'}), + 'created_at': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'db_index': 'True', 'blank': 'True'}), + 'description': ('django.db.models.fields.TextField', [], {'blank': 'True'}), + 'epub_file': ('catalogue.fields.EbookField', [], {'default': "''", 'max_length': '100', 'format_name': "'epub'", 'blank': 'True'}), + 'extra_info': ('jsonfield.fields.JSONField', [], {'default': "'{}'"}), + 'fb2_file': ('catalogue.fields.EbookField', [], {'default': "''", 'max_length': '100', 'format_name': "'fb2'", 'blank': 'True'}), + 'gazeta_link': ('django.db.models.fields.CharField', [], {'max_length': '240', 'blank': 'True'}), + 'html_file': ('catalogue.fields.EbookField', [], {'default': "''", 'max_length': '100', 'format_name': "'html'", 'blank': 'True'}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'language': ('django.db.models.fields.CharField', [], {'default': "'pol'", 'max_length': '3', 'db_index': 'True'}), + 'mobi_file': ('catalogue.fields.EbookField', [], {'default': "''", 'max_length': '100', 'format_name': "'mobi'", 'blank': 'True'}), + 'parent': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'children'", 'null': 'True', 'to': "orm['catalogue.Book']"}), + 'parent_number': ('django.db.models.fields.IntegerField', [], {'default': '0'}), + 'pdf_file': ('catalogue.fields.EbookField', [], {'default': "''", 'max_length': '100', 'format_name': "'pdf'", 'blank': 'True'}), + 'slug': ('django.db.models.fields.SlugField', [], {'unique': 'True', 'max_length': '120'}), + 'sort_key': ('django.db.models.fields.CharField', [], {'max_length': '120', 'db_index': 'True'}), + 'title': ('django.db.models.fields.CharField', [], {'max_length': '120'}), + 'txt_file': ('catalogue.fields.EbookField', [], {'default': "''", 'max_length': '100', 'format_name': "'txt'", 'blank': 'True'}), + 'wiki_link': ('django.db.models.fields.CharField', [], {'max_length': '240', 'blank': 'True'}), + 'xml_file': ('catalogue.fields.EbookField', [], {'default': "''", 'max_length': '100', 'format_name': "'xml'", 'blank': 'True'}) + }, + u'funding.funding': { + 'Meta': {'ordering': "['-payed_at']", 'object_name': 'Funding'}, + 'amount': ('django.db.models.fields.DecimalField', [], {'max_digits': '10', 'decimal_places': '2'}), + 'email': ('django.db.models.fields.EmailField', [], {'max_length': '75', 'blank': 'True'}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '127', 'blank': 'True'}), + 'offer': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['funding.Offer']"}), + 'payed_at': ('django.db.models.fields.DateTimeField', [], {'null': 'True', 'blank': 'True'}), + 'perks': ('django.db.models.fields.related.ManyToManyField', [], {'to': u"orm['funding.Perk']", 'symmetrical': 'False', 'blank': 'True'}) + }, + u'funding.offer': { + 'Meta': {'ordering': "['-end']", 'object_name': 'Offer'}, + 'author': ('django.db.models.fields.CharField', [], {'max_length': '255'}), + 'book': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['catalogue.Book']", 'null': 'True', 'blank': 'True'}), + 'description': ('django.db.models.fields.TextField', [], {'blank': 'True'}), + 'due': ('django.db.models.fields.DateField', [], {}), + 'end': ('django.db.models.fields.DateField', [], {}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'redakcja_url': ('django.db.models.fields.URLField', [], {'max_length': '200', 'blank': 'True'}), + 'slug': ('django.db.models.fields.SlugField', [], {'max_length': '50'}), + 'start': ('django.db.models.fields.DateField', [], {}), + 'target': ('django.db.models.fields.DecimalField', [], {'max_digits': '10', 'decimal_places': '2'}), + 'title': ('django.db.models.fields.CharField', [], {'max_length': '255'}) + }, + u'funding.perk': { + 'Meta': {'ordering': "['-price']", 'object_name': 'Perk'}, + 'description': ('django.db.models.fields.TextField', [], {'blank': 'True'}), + 'end_date': ('django.db.models.fields.DateField', [], {'null': 'True', 'blank': 'True'}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '255'}), + 'offer': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['funding.Offer']", 'null': 'True', 'blank': 'True'}), + 'price': ('django.db.models.fields.DecimalField', [], {'max_digits': '10', 'decimal_places': '2'}) + }, + u'funding.spent': { + 'Meta': {'ordering': "['-timestamp']", 'object_name': 'Spent'}, + 'amount': ('django.db.models.fields.DecimalField', [], {'max_digits': '10', 'decimal_places': '2'}), + 'book': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['catalogue.Book']"}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'timestamp': ('django.db.models.fields.DateField', [], {}) + } + } + + complete_apps = ['funding'] \ No newline at end of file diff --git a/apps/funding/migrations/0009_auto.py b/apps/funding/migrations/0009_auto.py new file mode 100644 index 000000000..ae1c41568 --- /dev/null +++ b/apps/funding/migrations/0009_auto.py @@ -0,0 +1,95 @@ +# -*- coding: utf-8 -*- +import datetime +from south.db import db +from south.v2 import SchemaMigration +from django.db import models + + +class Migration(SchemaMigration): + + def forwards(self, orm): + # Adding index on 'Offer', fields ['end'] + db.create_index(u'funding_offer', ['end']) + + # Adding index on 'Offer', fields ['start'] + db.create_index(u'funding_offer', ['start']) + + + def backwards(self, orm): + # Removing index on 'Offer', fields ['start'] + db.delete_index(u'funding_offer', ['start']) + + # Removing index on 'Offer', fields ['end'] + db.delete_index(u'funding_offer', ['end']) + + + models = { + 'catalogue.book': { + 'Meta': {'ordering': "('sort_key',)", 'object_name': 'Book'}, + '_related_info': ('jsonfield.fields.JSONField', [], {'null': 'True', 'blank': 'True'}), + 'changed_at': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'db_index': 'True', 'blank': 'True'}), + 'common_slug': ('django.db.models.fields.SlugField', [], {'max_length': '120'}), + 'cover': ('catalogue.fields.EbookField', [], {'max_length': '100', 'null': 'True', 'format_name': "'cover'", 'blank': 'True'}), + 'created_at': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'db_index': 'True', 'blank': 'True'}), + 'description': ('django.db.models.fields.TextField', [], {'blank': 'True'}), + 'epub_file': ('catalogue.fields.EbookField', [], {'default': "''", 'max_length': '100', 'format_name': "'epub'", 'blank': 'True'}), + 'extra_info': ('jsonfield.fields.JSONField', [], {'default': "'{}'"}), + 'fb2_file': ('catalogue.fields.EbookField', [], {'default': "''", 'max_length': '100', 'format_name': "'fb2'", 'blank': 'True'}), + 'gazeta_link': ('django.db.models.fields.CharField', [], {'max_length': '240', 'blank': 'True'}), + 'html_file': ('catalogue.fields.EbookField', [], {'default': "''", 'max_length': '100', 'format_name': "'html'", 'blank': 'True'}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'language': ('django.db.models.fields.CharField', [], {'default': "'pol'", 'max_length': '3', 'db_index': 'True'}), + 'mobi_file': ('catalogue.fields.EbookField', [], {'default': "''", 'max_length': '100', 'format_name': "'mobi'", 'blank': 'True'}), + 'parent': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'children'", 'null': 'True', 'to': "orm['catalogue.Book']"}), + 'parent_number': ('django.db.models.fields.IntegerField', [], {'default': '0'}), + 'pdf_file': ('catalogue.fields.EbookField', [], {'default': "''", 'max_length': '100', 'format_name': "'pdf'", 'blank': 'True'}), + 'slug': ('django.db.models.fields.SlugField', [], {'unique': 'True', 'max_length': '120'}), + 'sort_key': ('django.db.models.fields.CharField', [], {'max_length': '120', 'db_index': 'True'}), + 'title': ('django.db.models.fields.CharField', [], {'max_length': '120'}), + 'txt_file': ('catalogue.fields.EbookField', [], {'default': "''", 'max_length': '100', 'format_name': "'txt'", 'blank': 'True'}), + 'wiki_link': ('django.db.models.fields.CharField', [], {'max_length': '240', 'blank': 'True'}), + 'xml_file': ('catalogue.fields.EbookField', [], {'default': "''", 'max_length': '100', 'format_name': "'xml'", 'blank': 'True'}) + }, + u'funding.funding': { + 'Meta': {'ordering': "['-payed_at']", 'object_name': 'Funding'}, + 'amount': ('django.db.models.fields.DecimalField', [], {'max_digits': '10', 'decimal_places': '2'}), + 'email': ('django.db.models.fields.EmailField', [], {'max_length': '75', 'blank': 'True'}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '127', 'blank': 'True'}), + 'offer': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['funding.Offer']"}), + 'payed_at': ('django.db.models.fields.DateTimeField', [], {'null': 'True', 'blank': 'True'}), + 'perks': ('django.db.models.fields.related.ManyToManyField', [], {'to': u"orm['funding.Perk']", 'symmetrical': 'False', 'blank': 'True'}) + }, + u'funding.offer': { + 'Meta': {'ordering': "['-end']", 'object_name': 'Offer'}, + 'author': ('django.db.models.fields.CharField', [], {'max_length': '255'}), + 'book': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['catalogue.Book']", 'null': 'True', 'blank': 'True'}), + 'description': ('django.db.models.fields.TextField', [], {'blank': 'True'}), + 'due': ('django.db.models.fields.DateField', [], {}), + 'end': ('django.db.models.fields.DateField', [], {'db_index': 'True'}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'redakcja_url': ('django.db.models.fields.URLField', [], {'max_length': '200', 'blank': 'True'}), + 'slug': ('django.db.models.fields.SlugField', [], {'max_length': '50'}), + 'start': ('django.db.models.fields.DateField', [], {'db_index': 'True'}), + 'target': ('django.db.models.fields.DecimalField', [], {'max_digits': '10', 'decimal_places': '2'}), + 'title': ('django.db.models.fields.CharField', [], {'max_length': '255'}) + }, + u'funding.perk': { + 'Meta': {'ordering': "['-price']", 'object_name': 'Perk'}, + 'description': ('django.db.models.fields.TextField', [], {'blank': 'True'}), + 'end_date': ('django.db.models.fields.DateField', [], {'null': 'True', 'blank': 'True'}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '255'}), + 'offer': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['funding.Offer']", 'null': 'True', 'blank': 'True'}), + 'price': ('django.db.models.fields.DecimalField', [], {'max_digits': '10', 'decimal_places': '2'}) + }, + u'funding.spent': { + 'Meta': {'ordering': "['-timestamp']", 'object_name': 'Spent'}, + 'amount': ('django.db.models.fields.DecimalField', [], {'max_digits': '10', 'decimal_places': '2'}), + 'book': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['catalogue.Book']"}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'timestamp': ('django.db.models.fields.DateField', [], {}) + } + } + + complete_apps = ['funding'] \ No newline at end of file diff --git a/apps/funding/migrations/0010_auto.py b/apps/funding/migrations/0010_auto.py new file mode 100644 index 000000000..80d689c90 --- /dev/null +++ b/apps/funding/migrations/0010_auto.py @@ -0,0 +1,89 @@ +# -*- coding: utf-8 -*- +import datetime +from south.db import db +from south.v2 import SchemaMigration +from django.db import models + + +class Migration(SchemaMigration): + + def forwards(self, orm): + # Adding index on 'Funding', fields ['payed_at'] + db.create_index(u'funding_funding', ['payed_at']) + + + def backwards(self, orm): + # Removing index on 'Funding', fields ['payed_at'] + db.delete_index(u'funding_funding', ['payed_at']) + + + models = { + 'catalogue.book': { + 'Meta': {'ordering': "('sort_key',)", 'object_name': 'Book'}, + '_related_info': ('jsonfield.fields.JSONField', [], {'null': 'True', 'blank': 'True'}), + 'changed_at': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'db_index': 'True', 'blank': 'True'}), + 'common_slug': ('django.db.models.fields.SlugField', [], {'max_length': '120'}), + 'cover': ('catalogue.fields.EbookField', [], {'max_length': '100', 'null': 'True', 'format_name': "'cover'", 'blank': 'True'}), + 'created_at': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'db_index': 'True', 'blank': 'True'}), + 'description': ('django.db.models.fields.TextField', [], {'blank': 'True'}), + 'epub_file': ('catalogue.fields.EbookField', [], {'default': "''", 'max_length': '100', 'format_name': "'epub'", 'blank': 'True'}), + 'extra_info': ('jsonfield.fields.JSONField', [], {'default': "'{}'"}), + 'fb2_file': ('catalogue.fields.EbookField', [], {'default': "''", 'max_length': '100', 'format_name': "'fb2'", 'blank': 'True'}), + 'gazeta_link': ('django.db.models.fields.CharField', [], {'max_length': '240', 'blank': 'True'}), + 'html_file': ('catalogue.fields.EbookField', [], {'default': "''", 'max_length': '100', 'format_name': "'html'", 'blank': 'True'}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'language': ('django.db.models.fields.CharField', [], {'default': "'pol'", 'max_length': '3', 'db_index': 'True'}), + 'mobi_file': ('catalogue.fields.EbookField', [], {'default': "''", 'max_length': '100', 'format_name': "'mobi'", 'blank': 'True'}), + 'parent': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'children'", 'null': 'True', 'to': "orm['catalogue.Book']"}), + 'parent_number': ('django.db.models.fields.IntegerField', [], {'default': '0'}), + 'pdf_file': ('catalogue.fields.EbookField', [], {'default': "''", 'max_length': '100', 'format_name': "'pdf'", 'blank': 'True'}), + 'slug': ('django.db.models.fields.SlugField', [], {'unique': 'True', 'max_length': '120'}), + 'sort_key': ('django.db.models.fields.CharField', [], {'max_length': '120', 'db_index': 'True'}), + 'title': ('django.db.models.fields.CharField', [], {'max_length': '120'}), + 'txt_file': ('catalogue.fields.EbookField', [], {'default': "''", 'max_length': '100', 'format_name': "'txt'", 'blank': 'True'}), + 'wiki_link': ('django.db.models.fields.CharField', [], {'max_length': '240', 'blank': 'True'}), + 'xml_file': ('catalogue.fields.EbookField', [], {'default': "''", 'max_length': '100', 'format_name': "'xml'", 'blank': 'True'}) + }, + u'funding.funding': { + 'Meta': {'ordering': "['-payed_at']", 'object_name': 'Funding'}, + 'amount': ('django.db.models.fields.DecimalField', [], {'max_digits': '10', 'decimal_places': '2'}), + 'email': ('django.db.models.fields.EmailField', [], {'max_length': '75', 'blank': 'True'}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '127', 'blank': 'True'}), + 'offer': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['funding.Offer']"}), + 'payed_at': ('django.db.models.fields.DateTimeField', [], {'db_index': 'True', 'null': 'True', 'blank': 'True'}), + 'perks': ('django.db.models.fields.related.ManyToManyField', [], {'to': u"orm['funding.Perk']", 'symmetrical': 'False', 'blank': 'True'}) + }, + u'funding.offer': { + 'Meta': {'ordering': "['-end']", 'object_name': 'Offer'}, + 'author': ('django.db.models.fields.CharField', [], {'max_length': '255'}), + 'book': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['catalogue.Book']", 'null': 'True', 'blank': 'True'}), + 'description': ('django.db.models.fields.TextField', [], {'blank': 'True'}), + 'due': ('django.db.models.fields.DateField', [], {}), + 'end': ('django.db.models.fields.DateField', [], {'db_index': 'True'}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'redakcja_url': ('django.db.models.fields.URLField', [], {'max_length': '200', 'blank': 'True'}), + 'slug': ('django.db.models.fields.SlugField', [], {'max_length': '50'}), + 'start': ('django.db.models.fields.DateField', [], {'db_index': 'True'}), + 'target': ('django.db.models.fields.DecimalField', [], {'max_digits': '10', 'decimal_places': '2'}), + 'title': ('django.db.models.fields.CharField', [], {'max_length': '255'}) + }, + u'funding.perk': { + 'Meta': {'ordering': "['-price']", 'object_name': 'Perk'}, + 'description': ('django.db.models.fields.TextField', [], {'blank': 'True'}), + 'end_date': ('django.db.models.fields.DateField', [], {'null': 'True', 'blank': 'True'}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '255'}), + 'offer': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['funding.Offer']", 'null': 'True', 'blank': 'True'}), + 'price': ('django.db.models.fields.DecimalField', [], {'max_digits': '10', 'decimal_places': '2'}) + }, + u'funding.spent': { + 'Meta': {'ordering': "['-timestamp']", 'object_name': 'Spent'}, + 'amount': ('django.db.models.fields.DecimalField', [], {'max_digits': '10', 'decimal_places': '2'}), + 'book': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['catalogue.Book']"}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'timestamp': ('django.db.models.fields.DateField', [], {}) + } + } + + complete_apps = ['funding'] \ No newline at end of file diff --git a/apps/funding/migrations/__init__.py b/apps/funding/migrations/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/apps/funding/models.py b/apps/funding/models.py new file mode 100644 index 000000000..ae034f06d --- /dev/null +++ b/apps/funding/models.py @@ -0,0 +1,185 @@ +# -*- coding: utf-8 -*- +# This file is part of Wolnelektury, licensed under GNU Affero GPLv3 or later. +# Copyright © Fundacja Nowoczesna Polska. See NOTICE for more information. +# +from datetime import date, datetime +from django.core.urlresolvers import reverse +from django.db import models +from django.utils.translation import ugettext_lazy as _, ugettext as __ +import getpaid +from catalogue.models import Book + + +class Offer(models.Model): + """ A fundraiser for a particular book. """ + author = models.CharField(_('author'), max_length=255) + title = models.CharField(_('title'), max_length=255) + slug = models.SlugField(_('slug')) + description = models.TextField(_('description'), blank=True) + target = models.DecimalField(_('target'), decimal_places=2, max_digits=10) + start = models.DateField(_('start'), db_index=True) + end = models.DateField(_('end'), db_index=True) + due = models.DateField(_('due'), + help_text=_('When will it be published if the money is raised.')) + redakcja_url = models.URLField(_('redakcja URL'), blank=True) + book = models.ForeignKey(Book, null=True, blank=True, + help_text=_('Published book.')) + + class Meta: + verbose_name = _('offer') + verbose_name_plural = _('offers') + ordering = ['-end'] + + def __unicode__(self): + return u"%s - %s" % (self.author, self.title) + + def get_absolute_url(self): + return reverse('funding_offer', args=[self.slug]) + + def is_current(self): + return self.start <= date.today() <= self.end + + def is_win(self): + return self.sum() >= self.target + + def remaining(self): + if self.is_current(): + return None + if self.is_win(): + return self.sum() - self.target + else: + return self.sum() + + @classmethod + def current(cls): + """ Returns current fundraiser or None. """ + today = date.today() + objects = cls.objects.filter(start__lte=today, end__gte=today) + try: + return objects[0] + except IndexError: + return None + + @classmethod + def past(cls): + """ QuerySet for all current and past fundraisers. """ + today = date.today() + return cls.objects.filter(end__lt=today) + + @classmethod + def public(cls): + """ QuerySet for all current and past fundraisers. """ + today = date.today() + return cls.objects.filter(start__lte=today) + + def get_perks(self, amount=None): + """ Finds all the perks for the offer. + + If amount is provided, returns the perks you get for it. + + """ + perks = Perk.objects.filter( + models.Q(offer=self) | models.Q(offer=None) + ).exclude(end_date__lt=date.today()) + if amount is not None: + perks = perks.filter(price__lte=amount) + return perks + + def funding_payed(self): + """ QuerySet for all completed payments for the offer. """ + return Funding.payed().filter(offer=self) + + def sum(self): + """ The money gathered. """ + return self.funding_payed().aggregate(s=models.Sum('amount'))['s'] or 0 + + +class Perk(models.Model): + """ A perk offer. + + If no attached to a particular Offer, applies to all. + + """ + offer = models.ForeignKey(Offer, verbose_name=_('offer'), null=True, blank=True) + price = models.DecimalField(_('price'), decimal_places=2, max_digits=10) + name = models.CharField(_('name'), max_length=255) + description = models.TextField(_('description'), blank=True) + end_date = models.DateField(_('end date'), null=True, blank=True) + + class Meta: + verbose_name = _('perk') + verbose_name_plural = _('perks') + ordering = ['-price'] + + def __unicode__(self): + return "%s (%s%s)" % (self.name, self.price, u" for %s" % self.offer if self.offer else "") + + +class Funding(models.Model): + """ A person paying in a fundraiser. + + The payment was completed if and only if payed_at is set. + + """ + offer = models.ForeignKey(Offer, verbose_name=_('offer')) + name = models.CharField(_('name'), max_length=127, blank=True) + email = models.EmailField(_('email'), blank=True) + amount = models.DecimalField(_('amount'), decimal_places=2, max_digits=10) + payed_at = models.DateTimeField(_('payed at'), null=True, blank=True, db_index=True) + perks = models.ManyToManyField(Perk, verbose_name=_('perks'), blank=True) + + # Any additional info needed for perks? + + @classmethod + def payed(cls): + """ QuerySet for all completed payments. """ + return cls.objects.exclude(payed_at=None) + + class Meta: + verbose_name = _('funding') + verbose_name_plural = _('fundings') + ordering = ['-payed_at'] + + def __unicode__(self): + return unicode(self.offer) + + def get_absolute_url(self): + return reverse('funding_funding', args=[self.pk]) + +# Register the Funding model with django-getpaid for payments. +getpaid.register_to_payment(Funding, unique=False, related_name='payment') + + +class Spent(models.Model): + """ Some of the remaining money spent on a book. """ + book = models.ForeignKey(Book) + amount = models.DecimalField(_('amount'), decimal_places=2, max_digits=10) + timestamp = models.DateField(_('when')) + + class Meta: + verbose_name = _('money spent on a book') + verbose_name_plural = _('money spent on books') + ordering = ['-timestamp'] + + def __unicode__(self): + return u"Spent: %s" % unicode(self.book) + + +def new_payment_query_listener(sender, order=None, payment=None, **kwargs): + """ Set payment details for getpaid. """ + payment.amount = order.amount + payment.currency = 'PLN' +getpaid.signals.new_payment_query.connect(new_payment_query_listener) + + +def user_data_query_listener(sender, order, user_data, **kwargs): + """ Set user data for payment. """ + user_data['email'] = order.email +getpaid.signals.user_data_query.connect(user_data_query_listener) + +def payment_status_changed_listener(sender, instance, old_status, new_status, **kwargs): + """ React to status changes from getpaid. """ + if old_status != 'paid' and new_status == 'paid': + instance.order.payed_at = datetime.now() + instance.order.save() +getpaid.signals.payment_status_changed.connect(payment_status_changed_listener) diff --git a/apps/funding/static/funding/funding.css b/apps/funding/static/funding/funding.css new file mode 100755 index 000000000..56cac3f73 --- /dev/null +++ b/apps/funding/static/funding/funding.css @@ -0,0 +1 @@ +.funding{background:orange}.funding a.call{height:1.2em;width:13em;padding:.35em .5em;margin:.5em;display:inline-block;vertical-align:top;text-align:center;background:rgb(.465%, 59.936%, 63.653%)}.funding .description{display:inline-block;padding-left:.6em}.funding .description a{display:block;color:#000}.funding strong{font-size:1.5em;padding:.2em .2em 0;display:block}.funding .progress{width:95.7em;margin:.1em .3em .4em;border-radius:2em;background-image:url(/static/img/progress-pixel.png);background-repeat:repeat-y;background-color:rgba(236, 109, 0, .5);box-shadow:.1em .1em .1em #888}.funding .progress .piece{font-size:1.3em;padding:.3em .5em}.funding .with-button .progress{width:73em}.wlfund{width:100%;border-collapse:collapse}.wlfund td{padding:0 0 1em 0;text-align:center}.wlfund td:last-child{text-align:right}.wlfund td div{padding:1em;box-shadow:0 2px 0 #DDD}.wlfund .funding-plus td div{background:rgba(13, 126, 133, .2)}.wlfund .funding-minus td div{background:#fff}.honking{background:#018189;font-size:1.5em;padding:.5em;color:#fff;border:0;box-shadow:.2em .2em .3em #888;position:relative}.honking:hover{box-shadow:none;top:.1em;left:.1em}.share a{margin-right:1.5em}.share a img{vertical-align:middle} \ No newline at end of file diff --git a/apps/funding/static/funding/funding.scss b/apps/funding/static/funding/funding.scss new file mode 100755 index 000000000..ef766f506 --- /dev/null +++ b/apps/funding/static/funding/funding.scss @@ -0,0 +1,103 @@ +.funding { + background: orange; + + a.call { + height: 1.2em; + width: 13em; + padding: .35em .5em; + margin: .5em; + display: inline-block; + vertical-align: top; + text-align: center; + + background: lighten(#018189, .05); + } + .description { + display: inline-block; + padding-left: .6em; + a { + display: block; + color: black; + } + } + strong { + font-size: 1.5em; + padding: .2em .2em 0; + display: block; + } + .progress { + .piece { + font-size: 1.3em; + padding: .3em .5em; + } + width: 95.7em; + margin: .1em .3em .4em; + border-radius: 2em; + background-image: url(/static/img/progress-pixel.png); + background-repeat: repeat-y; + background-color: fade-out(#ec6d00, .5); + box-shadow: .1em .1em .1em #888; + } + .with-button .progress { + width: 73em; + } +} + + + + +.wlfund { + width: 100%; + border-collapse: collapse; + + td { + padding: 0 0 1em 0; + text-align: center; + } + + td:last-child { + text-align: right; + } + + td div { + padding: 1em; + box-shadow: 0 2px 0 #DDDDDD; + } + + .funding-plus td div { + background: fade-out(#0D7E85, .8); + } + + .funding-minus td div { + background: white; + } +} + + + +.honking { + background: #018189; + font-size: 1.5em; + padding: .5em; + color: white; + border: 0; + box-shadow: 0.2em 0.2em 0.3em #888888; + position: relative; +} +.honking:hover { + box-shadow: none; + top: .1em; + left: .1em; +} + + + +.share { + a { + margin-right: 1.5em; + + img { + vertical-align: middle; + } + } +} diff --git a/apps/funding/templates/funding/no_thanks.html b/apps/funding/templates/funding/no_thanks.html new file mode 100755 index 000000000..64ff3c814 --- /dev/null +++ b/apps/funding/templates/funding/no_thanks.html @@ -0,0 +1,22 @@ +{% extends "base.html" %} +{% load i18n %} +{% load fnp_share %} + +{% block titleextra %}{% trans "Payment failed" %}{% endblock %} + +{% block body %} + +

{% trans "Payment failed" %}

+
+ +

{% trans "You're support has not been processed successfully." %}

+ + +{% url 'funding_current' as current %} + +

{% trans "Go back to the current fundraiser." %}

+ +
+ + +{% endblock %} diff --git a/apps/funding/templates/funding/offer_detail.html b/apps/funding/templates/funding/offer_detail.html new file mode 100755 index 000000000..da50f13a7 --- /dev/null +++ b/apps/funding/templates/funding/offer_detail.html @@ -0,0 +1,85 @@ +{% extends "base.html" %} +{% load url from future %} +{% load i18n %} +{% load funding_tags %} +{% load pagination_tags %} +{% load fnp_share %} + + +{% block titleextra %}{{ object }}{% endblock %} + +{% block metadescription %}Wesprzyj kolejną publikację Wolnych Lektur!{% endblock %} + + +{% block body %} + +

{{ object }}

+ +
{{ object.description|safe }}
+ +{% funding object %} +
+
+ {% offer_status object %} + {% offer_status_more object %} +

{% trans "Learn more" %}.

+
+ + + {% if object.is_current %} +
+

{% trans "Support the publication" %}

+
+ {% csrf_token %} + + {{ form.as_table }} + +
+ +
+
+
+ + {% url 'funding_current' object.slug as current %} +

{% trans "Tell your friends!" %}

+ + {% endif %} + +

{% trans "See all fundraisers." %}

+ +
+ + +

{% trans "Supporters" %}:

+ +
+{% with object.funding_payed.all as fundings %} + + + {% autopaginate fundings 10 %} + {% for funding in fundings %} + + + + + + {% endfor %} +
{{ funding.payed_at.date }}
+ {% if funding.name %} + {{ funding.name }} + {% else %} + {% trans "Anonymous" %} + {% endif %} +
{{ funding.amount }} zł
+ {% for perk in funding.perks.all %} + {{ perk.name }}{% if not forloop.last %},{% endif %} + {% endfor %}  +
+ + {% paginate %} +{% endwith %} +
+ +{% endblock %} diff --git a/apps/funding/templates/funding/offer_list.html b/apps/funding/templates/funding/offer_list.html new file mode 100755 index 000000000..ffb6af000 --- /dev/null +++ b/apps/funding/templates/funding/offer_list.html @@ -0,0 +1,44 @@ +{% extends "base.html" %} +{% load url from future %} +{% load i18n %} +{% load funding_tags %} +{% load pagination_tags %} + +{% block titleextra %}{% trans "All fundraisers" %}{% endblock %} + +{% block bodyid %}funding-offer-list{% endblock %} + +{% block body %} +

{% trans "All fundraisers" %}

+ + +{% autopaginate object_list 10 %} +{% for offer in object_list %} +{% with is_win=offer.is_win is_current=offer.is_current %} + + {% if is_current %} +

{% trans "Current fundraiser:" %}

+ {% elif forloop.is_first %} +

{% trans "Previous fundraisers:" %}

+ {% endif %} + +
+ {% offer_status offer %} +
+ + {% funding offer link=1 %} + + +
+ {% offer_status_more offer %} +
+ + {% if is_current and not forloop.is_last %} +

{% trans "Previous fundraisers:" %}

+ {% endif %} + +{% endwith %} +{% endfor %} +{% paginate %} + +{% endblock %} diff --git a/apps/funding/templates/funding/snippets/any_remaining.html b/apps/funding/templates/funding/snippets/any_remaining.html new file mode 100755 index 000000000..86db70fd3 --- /dev/null +++ b/apps/funding/templates/funding/snippets/any_remaining.html @@ -0,0 +1,4 @@ +{% load i18n %} +{% url 'funding_wlfund' as wlfund %} +{% blocktrans %}Any remaining funds will be spent +on other books waiting to be published in the library.{% endblocktrans %} diff --git a/apps/funding/templates/funding/tags/funding.html b/apps/funding/templates/funding/tags/funding.html new file mode 100755 index 000000000..c842f8ad5 --- /dev/null +++ b/apps/funding/templates/funding/tags/funding.html @@ -0,0 +1,37 @@ +{% load i18n %} +{% load time_tags %} +{% if offer %} +{% spaceless %} + +{% endspaceless %} +{% endif %} diff --git a/apps/funding/templates/funding/tags/offer_status.html b/apps/funding/templates/funding/tags/offer_status.html new file mode 100755 index 000000000..24a5fcde7 --- /dev/null +++ b/apps/funding/templates/funding/tags/offer_status.html @@ -0,0 +1,25 @@ +{% load i18n %} + +{% if offer.is_current %} + {% if offer.is_win %} +

+ {% blocktrans with due=offer.due end=offer.end %}The fundraiser + ends on {{ end }}. The book will be published by {{ due }}.{% endblocktrans %} +

+ {% else %} +

+ {% blocktrans with due=offer.due end=offer.end %}If the target is met + by {{ end }}, this book will be published by {{ due }}.{% endblocktrans %} +

+ {% endif %} +{% else %} + {% if offer.is_win %} +

+ {% trans "Full amount was successfully raised!" %} +

+ {% else %} +

+ {% trans "The amount needed was not raised." %} +

+ {% endif %} +{% endif %} diff --git a/apps/funding/templates/funding/tags/offer_status_more.html b/apps/funding/templates/funding/tags/offer_status_more.html new file mode 100755 index 000000000..3ba0440ce --- /dev/null +++ b/apps/funding/templates/funding/tags/offer_status_more.html @@ -0,0 +1,28 @@ +{% load i18n %} + +{% if offer.is_current %} +

+ {% include "funding/snippets/any_remaining.html" %} +

+{% else %} +

{{ offer.start }} – {{ offer.end }}

+ {% if offer.is_win %} +

+ {% if offer.book %} + {% blocktrans with bu=offer.book.get_absolute_url bt=offer.book %}The book + {{ bt }} has been already published.{% endblocktrans %} + {% else %} + {% blocktrans with due=offer.due %}The book + will be published by {{ due }}.{% endblocktrans %} + {% if offer.redakcja_link %} + {% blocktrans with r=offer.redakcja_url %}You can follow + the work on the Editorial Platform.{% endblocktrans %} + {% endif %} + {% endif %} +

+ {% endif %} + + {% if offer.remaining %} +

{% include "funding/snippets/any_remaining.html" %}

+ {% endif %} +{% endif %} diff --git a/apps/funding/templates/funding/thanks.html b/apps/funding/templates/funding/thanks.html new file mode 100755 index 000000000..923ed666d --- /dev/null +++ b/apps/funding/templates/funding/thanks.html @@ -0,0 +1,40 @@ +{% extends "base.html" %} +{% load i18n %} +{% load fnp_share %} + +{% block titleextra %}{% trans "Thank you for your support!" %}{% endblock %} + +{% block body %} + +

{% trans "Thank you!" %}

+
+ +{% trans "Thank you for your support!" %} + +{% if offer.is_win %} +

{% trans "Full amount was successfully raised!" %}

+ +

{% blocktrans with due=offer.due end=offer.end %}The fundraiser + ends on {{ end }}. The book will be published by {{ due }}.{% endblocktrans %}

+{% else %} +

{% blocktrans with b=offer.title due=offer.due end=offer.end %}Your + donation will be spent on publishing + the book {{ b }} if the full amount is raised by {{ end }}. + The book will then be published by {{ due }}.{% endblocktrans %}

+{% endif %} + +

{% include "funding/snippets/any_remaining.html" %} + +{% trans "Learn more" %}.

+ +{% url 'funding_current' offer.slug as current %} +

{% trans "Go back to the current fundraiser." %}

+ + +

{% trans "Tell your friends!" %}

+ + +
+ + +{% endblock %} diff --git a/apps/funding/templates/funding/widgets/amount.html b/apps/funding/templates/funding/widgets/amount.html new file mode 100644 index 000000000..28470684d --- /dev/null +++ b/apps/funding/templates/funding/widgets/amount.html @@ -0,0 +1,19 @@ +{% load i18n %} +
+{% if perks %} + {% for perk in perks %} +
+ {% endfor %} + + zł +{% else %} + +{% endif %} +
diff --git a/apps/funding/templates/funding/wlfund.html b/apps/funding/templates/funding/wlfund.html new file mode 100755 index 000000000..873e7cf5a --- /dev/null +++ b/apps/funding/templates/funding/wlfund.html @@ -0,0 +1,56 @@ +{% extends "base.html" %} +{% load i18n %} + +{% block titleextra %}{% trans "Remaining funds" %}{% endblock %} + +{% block body %} + +

{% trans "Remaining funds" %}

+ +
+

{% blocktrans with r="http://redakcja.wolnelektury.pl/" %}If +the full amount needed for publishing a book is not raised in time, +the funds are spent on other books waiting for +publication. The same thing happens with any money remaining +from successful fundraisers.{% endblocktrans %} + +{% trans "Learn more" %}.

+ +

{% trans "Spending these remaining funds is recorded in this table." %}

+
+ + + + + + + + + + + + {% for tag, entry in log %} + {% if tag == 'spent' %} + + + + + + + {% else %} + + + + + + + {% endif %} + {% endfor %} +
{% trans "Date" %}:
{% trans "Title" %}:
{% trans "Amount" %}:
{% trans "Balance" %}:
{{ entry.timestamp }}
{% trans "Money spent on publishing the book" %}: + + {{ entry.book }}
-{{ entry.amount }} zł
{{ entry.total }} zł
{{ entry.end }}
{% trans "Money remaining from the fundraiser for" %}: + + {{ entry }}
+{{ entry.wlfund }} zł
{{ entry.total }} zł
+ + +{% endblock %} diff --git a/apps/funding/templatetags/__init__.py b/apps/funding/templatetags/__init__.py new file mode 100755 index 000000000..e69de29bb diff --git a/apps/funding/templatetags/funding_tags.py b/apps/funding/templatetags/funding_tags.py new file mode 100755 index 000000000..bfac2654e --- /dev/null +++ b/apps/funding/templatetags/funding_tags.py @@ -0,0 +1,39 @@ +from django import template +from ..models import Offer + +register = template.Library() + + +@register.inclusion_tag("funding/tags/funding.html", takes_context=True) +def funding(context, offer=None, link=False, add_class=""): + if offer is None and context.get('funding_no_show_current') is None: + offer = Offer.current() + if offer is None: + return {} + + offer_sum = offer.sum() + return { + 'offer': offer, + 'sum': offer_sum, + 'is_current': offer.is_current(), + 'is_win': offer_sum >= offer.target, + 'missing': offer.target - offer_sum, + 'percentage': 100 * offer_sum / offer.target, + 'link': link, + 'add_class': add_class, + } + + +@register.inclusion_tag("funding/tags/offer_status.html") +def offer_status(offer): + return { + 'offer': offer, + } + +@register.inclusion_tag("funding/tags/offer_status_more.html") +def offer_status_more(offer): + return { + 'offer': offer, + } + + diff --git a/apps/funding/tests.py b/apps/funding/tests.py new file mode 100644 index 000000000..c9438a878 --- /dev/null +++ b/apps/funding/tests.py @@ -0,0 +1,28 @@ +# -*- coding: utf-8 -*- +# This file is part of Wolnelektury, licensed under GNU Affero GPLv3 or later. +# Copyright © Fundacja Nowoczesna Polska. See NOTICE for more information. +# +from django.test import TestCase +from .models import Offer, Perk, Funding + + +class FundTest(TestCase): + def setUp(self): + self.offer1 = Offer.objects.create( + author='author1', title='title1', slug='slug1', + target=100, start='2013-03-01', end='2013-03-31') + + def test_perks(self): + perk = Perk.objects.create(price=20, name='Perk 20') + perk1 = Perk.objects.create(offer=self.offer1, price=50, name='Perk 50') + offer2 = Offer.objects.create( + author='author2', title='title2', slug='slug2', + target=100, start='2013-02-01', end='2013-02-20') + perk2 = Perk.objects.create(offer=offer2, price=1, name='Perk 1') + + self.assertEqual( + set(self.offer1.fund('Tester', 'test@example.com', 10).perks.all()), + set()) + self.assertEqual( + set(self.offer1.fund('Tester', 'test@example.com', 70).perks.all()), + set([perk, perk1])) diff --git a/apps/funding/urls.py b/apps/funding/urls.py new file mode 100644 index 000000000..e92704d71 --- /dev/null +++ b/apps/funding/urls.py @@ -0,0 +1,24 @@ +# -*- coding: utf-8 -*- +# This file is part of Wolnelektury, licensed under GNU Affero GPLv3 or later. +# Copyright © Fundacja Nowoczesna Polska. See NOTICE for more information. +# +from django.conf.urls import patterns, url, include + +from .models import Offer +from .views import (WLFundView, OfferDetailView, OfferListView, + ThanksView, NoThanksView, CurrentView) + + +urlpatterns = patterns('', + + url(r'^$', CurrentView.as_view(), name='funding_current'), + url(r'^teraz/(?P[^/]+)/$', CurrentView.as_view(), name='funding_current'), + url(r'^lektura/$', OfferListView.as_view(), name='funding'), + url(r'^lektura/(?P[^/]+)/$', OfferDetailView.as_view(), name='funding_offer'), + url(r'^pozostale/$', WLFundView.as_view(), name='funding_wlfund'), + + url(r'^dziekujemy/$', ThanksView.as_view(), name='funding_thanks'), + url(r'^niepowodzenie/$', NoThanksView.as_view(), name='funding_nothanks'), + + url(r'^getpaid/', include('getpaid.urls')), +) diff --git a/apps/funding/views.py b/apps/funding/views.py new file mode 100644 index 000000000..bf2a073dc --- /dev/null +++ b/apps/funding/views.py @@ -0,0 +1,140 @@ +# -*- coding: utf-8 -*- +# This file is part of Wolnelektury, licensed under GNU Affero GPLv3 or later. +# Copyright © Fundacja Nowoczesna Polska. See NOTICE for more information. +# +from datetime import date +from django.views.decorators.cache import never_cache +from django.conf import settings +from django.core.urlresolvers import reverse +from django.http import Http404 +from django.shortcuts import redirect, get_object_or_404 +from django.views.generic import TemplateView, FormView, DetailView, ListView +import getpaid.backends.payu +from getpaid.models import Payment +from .forms import FundingForm +from .models import Offer, Spent, Funding + + +def mix(*streams): + substreams = [] + for stream, read_date, tag in streams: + iterstream = iter(stream) + try: + item = next(iterstream) + except StopIteration: + pass + else: + substreams.append([read_date(item), item, iterstream, read_date, tag]) + while substreams: + i, substream = max(enumerate(substreams), key=lambda x: x[1][0]) + yield substream[4], substream[1] + try: + item = next(substream[2]) + except StopIteration: + del substreams[i] + else: + substream[0:2] = [substream[3](item), item] + + +class WLFundView(TemplateView): + template_name = "funding/wlfund.html" + + def get_context_data(self): + def add_total(total, it): + for tag, e in it: + e.total = total + if tag == 'spent': + total += e.amount + else: + total -= e.wlfund + yield tag, e + + ctx = super(WLFundView, self).get_context_data() + offers = [] + + for o in Offer.past(): + if o.is_win(): + o.wlfund = o.sum() - o.target + if o.wlfund > 0: + offers.append(o) + else: + o.wlfund = o.sum() + if o.wlfund > 0: + offers.append(o) + amount = sum(o.wlfund for o in offers) - sum(o.amount for o in Spent.objects.all()) + + ctx['amount'] = amount + ctx['log'] = add_total(amount, mix( + (offers, lambda x: x.end, 'offer'), + (Spent.objects.all().select_related(), lambda x: x.timestamp, 'spent'), + )) + return ctx + + +class OfferDetailView(FormView): + form_class = FundingForm + template_name = "funding/offer_detail.html" + backend = 'getpaid.backends.payu' + + def dispatch(self, request, slug=None): + if getattr(self, 'object', None) is None: + if slug: + self.object = get_object_or_404(Offer.public(), slug=slug) + else: + self.object = Offer.current() + if self.object is None: + raise Http404 + return super(OfferDetailView, self).dispatch(request, slug) + + def get_form(self, form_class): + if self.request.method == 'POST': + return form_class(self.object, self.request.POST) + else: + return form_class(self.object, initial={'amount': settings.FUNDING_DEFAULT}) + + def get_context_data(self, *args, **kwargs): + ctx = super(OfferDetailView, self).get_context_data(*args, **kwargs) + ctx['object'] = self.object + if self.object.is_current(): + ctx['funding_no_show_current'] = True + return ctx + + def form_valid(self, form): + funding = form.save() + # Skip getpaid.forms.PaymentMethodForm, go directly to the broker. + payment = Payment.create(funding, self.backend) + gateway_url_tuple = payment.get_processor()(payment).get_gateway_url(self.request) + payment.change_status('in_progress') + return redirect(gateway_url_tuple[0]) + + +class CurrentView(OfferDetailView): + def dispatch(self, request, slug=None): + self.object = Offer.current() + if self.object is None: + raise Http404 + elif slug != self.object.slug: + return redirect(reverse('funding_current', args=[self.object.slug])) + return super(CurrentView, self).dispatch(request, slug) + + +class OfferListView(ListView): + queryset = Offer.public() + + def get_context_data(self, *args, **kwargs): + ctx = super(OfferListView, self).get_context_data(*args, **kwargs) + ctx['funding_no_show_current'] = True + return ctx + + +class ThanksView(TemplateView): + template_name = "funding/thanks.html" + + def get_context_data(self, *args, **kwargs): + ctx = super(ThanksView, self).get_context_data(*args, **kwargs) + ctx['offer'] = Offer.current() + ctx['funding_no_show_current'] = True + return ctx + +class NoThanksView(TemplateView): + template_name = "funding/no_thanks.html" diff --git a/apps/funding/widgets.py b/apps/funding/widgets.py new file mode 100644 index 000000000..cd7bf9b0d --- /dev/null +++ b/apps/funding/widgets.py @@ -0,0 +1,41 @@ +# -*- coding: utf-8 -*- +# This file is part of Wolnelektury, licensed under GNU Affero GPLv3 or later. +# Copyright © Fundacja Nowoczesna Polska. See NOTICE for more information. +# +from decimal import Decimal +from django.conf import settings +from django import forms +from django.template.loader import render_to_string + + +class PerksAmountWidget(forms.Textarea): + def perks_input_name(self, name): + return "_%s_perk" % name + + def render(self, name, value, attrs=None): + try: + value = Decimal(value) + except: + pass + perks = list(self.form_instance.offer.get_perks()) + perk_chosen = False + for perk in perks: + if perk.price == value: + perk.chosen = True + perk_chosen = True + break + + return render_to_string("funding/widgets/amount.html", { + "perks": perks, + "name": name, + "perks_input_name": self.perks_input_name(name), + "perk_chosen": perk_chosen, + "value": value, + "attrs": attrs, + }) + + def value_from_datadict(self, data, files, name): + num_str = data.get(self.perks_input_name(name)) or data[name] + return num_str.replace(',', '.') + + diff --git a/apps/lesmianator/templates/lesmianator/lesmianator.html b/apps/lesmianator/templates/lesmianator/lesmianator.html index 0148296e0..cc7decbc7 100644 --- a/apps/lesmianator/templates/lesmianator/lesmianator.html +++ b/apps/lesmianator/templates/lesmianator/lesmianator.html @@ -20,12 +20,12 @@

Przygotowaliśmy kilka propozycji na start – możesz wybrać jedną z nich, albo ułożyć sobie własną, niepowtarzalną mieszankę.

    -
  • Adam Mickiewicz, Liryki lozańskie

  • -
  • Adam Mickiewicz, Sonety krymskie

  • -
  • Jan Kasprowicz, Hymny

  • -
  • Bogurodzica

  • +
  • Adam Mickiewicz, Liryki lozańskie
  • +
  • Adam Mickiewicz, Sonety krymskie
  • +
  • Jan Kasprowicz, Hymny
  • +
  • Bogurodzica
  • {% for s in shelves %} -
  • {{ s.name }}

  • +
  • {{ s.name }}
  • {% endfor %} diff --git a/apps/modeltranslation/fields.py b/apps/modeltranslation/fields.py index be942f6a5..fe413ce3e 100644 --- a/apps/modeltranslation/fields.py +++ b/apps/modeltranslation/fields.py @@ -1,6 +1,7 @@ # -*- coding: utf-8 -*- from django.conf import settings from django.db.models.fields import Field, CharField +from django.utils.translation import string_concat from modeltranslation.utils import get_language, build_localized_fieldname @@ -44,12 +45,8 @@ class TranslationField(Field): # Copy the verbose name and append a language suffix (will e.g. in the # admin). This might be a proxy function so we have to check that here. - if hasattr(translated_field.verbose_name, '_proxy____unicode_cast'): - verbose_name = \ - translated_field.verbose_name._proxy____unicode_cast() - else: - verbose_name = translated_field.verbose_name - self.verbose_name = '%s [%s]' % (verbose_name, language) + self.verbose_name = string_concat(translated_field.verbose_name, + ' [%s]' % (language, )) def pre_save(self, model_instance, add): val = super(TranslationField, self).pre_save(model_instance, add) diff --git a/apps/oai/handlers.py b/apps/oai/handlers.py index 59e599c98..eabb59c9f 100644 --- a/apps/oai/handlers.py +++ b/apps/oai/handlers.py @@ -12,6 +12,7 @@ from lxml.etree import ElementTree from django.db.models import Q from django.conf import settings from django.contrib.sites.models import Site +from django.utils import timezone WL_DC_READER_XPATH = '(.|*)/rdf:RDF/rdf:Description/%s/text()' @@ -60,7 +61,7 @@ class Catalogue(common.ResumptionOAIPMH): self.oai_id = "oai:" + Site.objects.get_current().domain + ":%s" # earliest change - year_zero = datetime(1990, 1, 1, 0, 0, 0) + year_zero = timezone.make_aware(datetime(1990, 1, 1, 0, 0, 0), timezone.utc) try: earliest_change = \ diff --git a/apps/pdcounter/static/pdcounter/pdcounter.js b/apps/pdcounter/static/pdcounter/pdcounter.js index 0352076b8..a1ff53736 100755 --- a/apps/pdcounter/static/pdcounter/pdcounter.js +++ b/apps/pdcounter/static/pdcounter/pdcounter.js @@ -1,8 +1,7 @@ (function($) { $(function() { - - $('#countdown').each(function() { + $('.countdown').each(function() { var $this = $(this); var serverTime = function() { @@ -24,13 +23,19 @@ $.countdown.setDefaults($.countdown.regional['']); } - var d = new Date($this.attr('data-year'), 0, 1); - function re() {location.reload()}; - $this.countdown({until: d, format: 'ydHMS', serverSync: serverTime, - onExpiry: re, alwaysExpire: true}); - + var options = { + until: new Date($this.attr('data-until')), + format: 'ydHMS', + serverSync: serverTime, + onExpiry: function(){location.reload()}, // TODO: no reload + }; + if ($this.hasClass('inline')) { + options.layout = '{d<}{dn} {dl} {d>}{hnn}{sep}{mnn}{sep}{snn}'; + } + + $this.countdown(options); }); }); -})(jQuery); \ No newline at end of file +})(jQuery); diff --git a/apps/pdcounter/templates/pdcounter/author_detail.html b/apps/pdcounter/templates/pdcounter/author_detail.html index 3810a4578..7ed5fa7b2 100644 --- a/apps/pdcounter/templates/pdcounter/author_detail.html +++ b/apps/pdcounter/templates/pdcounter/author_detail.html @@ -1,5 +1,6 @@ {% extends "base.html" %} {% load i18n %} +{% load time_tags %} {% block titleextra %}{{ author.name }}{% endblock %} @@ -40,7 +41,7 @@ {% else %}

    {% trans "This author's works will become part of public domain and will be allowed to be published without restrictions in" %}

    -
    +

    {% trans "Find out why Internet libraries can't publish this author's works." %}

    {% endif %} diff --git a/apps/pdcounter/templates/pdcounter/book_stub_detail.html b/apps/pdcounter/templates/pdcounter/book_stub_detail.html index f76edd17a..af91fcbb6 100644 --- a/apps/pdcounter/templates/pdcounter/book_stub_detail.html +++ b/apps/pdcounter/templates/pdcounter/book_stub_detail.html @@ -1,5 +1,6 @@ {% extends "base.html" %} {% load i18n %} +{% load time_tags %} {% block titleextra %}{{ book.title }}{% endblock %} @@ -17,7 +18,7 @@ {% else %} {% if book.pd %}

    {% trans "This work will become part of public domain and will be allowed to be published without restrictions in" %}

    -
    +

    {% trans "Find out why Internet libraries can't publish this work." %}

    {% else %}

    {% trans "This work is copyrighted." %} diff --git a/apps/pdcounter/templatetags/__init__.py b/apps/pdcounter/templatetags/__init__.py new file mode 100755 index 000000000..e69de29bb diff --git a/apps/pdcounter/templatetags/time_tags.py b/apps/pdcounter/templatetags/time_tags.py new file mode 100755 index 000000000..e454acd6b --- /dev/null +++ b/apps/pdcounter/templatetags/time_tags.py @@ -0,0 +1,27 @@ +import datetime +import pytz +from django.conf import settings +from django import template +from django.utils import timezone + + +register = template.Library() + +@register.filter +def date_to_utc(date, day_end=False): + """ Converts a datetime.date to UTC datetime. + + The datetime represents the start (or end) of the given day in + the server's timezone. + """ + if day_end: + date += datetime.timedelta(1) + localtime = datetime.datetime.combine(date, datetime.time(0,0)) + return timezone.utc.normalize( + pytz.timezone(settings.TIME_ZONE).localize(localtime) + ) + + +@register.filter +def utc_for_js(dt): + return dt.strftime('%Y/%m/%d %H:%M:%S UTC') diff --git a/apps/pdcounter/views.py b/apps/pdcounter/views.py index b07ee11e9..8fb1b13fa 100644 --- a/apps/pdcounter/views.py +++ b/apps/pdcounter/views.py @@ -2,8 +2,7 @@ # This file is part of Wolnelektury, licensed under GNU Affero GPLv3 or later. # Copyright © Fundacja Nowoczesna Polska. See NOTICE for more information. # -#from datetime import datetime - +from datetime import datetime from django.template import RequestContext from django.shortcuts import render_to_response, get_object_or_404 from pdcounter import models @@ -12,7 +11,7 @@ from suggest.forms import PublishingSuggestForm def book_stub_detail(request, slug): book = get_object_or_404(models.BookStub, slug=slug) - pd_counter = book.pd + pd_counter = datetime(book.pd, 1, 1) form = PublishingSuggestForm( initial={"books": u"%s — %s, \n" % (book.author, book.title)}) @@ -23,7 +22,7 @@ def book_stub_detail(request, slug): def author_detail(request, slug): author = get_object_or_404(models.Author, slug=slug) - pd_counter = author.goes_to_pd() + pd_counter = datetime(author.goes_to_pd(), 1, 1) form = PublishingSuggestForm(initial={"books": author.name + ", \n"}) diff --git a/apps/wolnelektury_core/static/css/base.css b/apps/wolnelektury_core/static/css/base.css index 5c29ef046..3496937ea 100755 --- a/apps/wolnelektury_core/static/css/base.css +++ b/apps/wolnelektury_core/static/css/base.css @@ -58,11 +58,19 @@ ul.plain { } h2 { + font-size: 2em; + font-weight: normal; +} + +h2.plain { margin: 0; font-size: 1em; - font-weight: normal; } +h3 { + font-size: 1.5em; + font-weight: normal; +} .mono { font-family: "Andale Mono", "Lucida Sans Typewriter", "Courier New"; diff --git a/apps/wolnelektury_core/static/css/book_box.css b/apps/wolnelektury_core/static/css/book_box.css index 74b710aff..190ddd773 100755 --- a/apps/wolnelektury_core/static/css/book_box.css +++ b/apps/wolnelektury_core/static/css/book_box.css @@ -286,6 +286,11 @@ ul.inline-items li { .book-wide-box .other-download ul { font-size: 1.1em; } +.book-wide-box .other-tools h2, +.book-wide-box .other-download h2 { + margin: 0; +} + .book-wide-box .license-icon { diff --git a/apps/wolnelektury_core/static/css/catalogue.css b/apps/wolnelektury_core/static/css/catalogue.css index 0e952ba7d..5f52f248c 100755 --- a/apps/wolnelektury_core/static/css/catalogue.css +++ b/apps/wolnelektury_core/static/css/catalogue.css @@ -49,6 +49,11 @@ list-style: none; } +#book-a-list #book-list h2 { + font-size: 1em; + margin: 0; +} + #book-a-list #book-list h2 a { color: black; } @@ -66,6 +71,7 @@ .catalogue-catalogue h2 { font-size: 2em; + margin: 0; } .catalogue-catalogue ul { column-width: 30em; @@ -141,6 +147,7 @@ } .see-also h2, .download h2 { font-size: 1.1em; + margin: 0; } .see-also ul, .download ul { list-style: none; diff --git a/apps/wolnelektury_core/static/css/core.css b/apps/wolnelektury_core/static/css/core.css index b5e4432e4..514f8af3a 100644 --- a/apps/wolnelektury_core/static/css/core.css +++ b/apps/wolnelektury_core/static/css/core.css @@ -1,3 +1,3 @@ -@import url("screen.css"); -@import url("antiscreen.css") handheld; -@import url("antiscreen.css") only screen and (max-device-width:480px); +@import url(screen.css); +@import url(antiscreen.css) handheld; +@import url(antiscreen.css) only screen and (max-device-width:480px); diff --git a/apps/wolnelektury_core/static/css/form.css b/apps/wolnelektury_core/static/css/form.css new file mode 100644 index 000000000..65d0482ef --- /dev/null +++ b/apps/wolnelektury_core/static/css/form.css @@ -0,0 +1 @@ +form table th{vertical-align:top;text-align:left;font-weight:normal}form table td{padding-bottom:1em}form table .required th:after{content:" *"}form table .errorlist{color:red;margin:0;padding:0;list-style:none}form table .helptext{color:#888;font-size:.9em;font-style:italic} \ No newline at end of file diff --git a/apps/wolnelektury_core/static/css/form.scss b/apps/wolnelektury_core/static/css/form.scss new file mode 100644 index 000000000..42e867595 --- /dev/null +++ b/apps/wolnelektury_core/static/css/form.scss @@ -0,0 +1,26 @@ +form table { + th { + vertical-align: top; + text-align: left; + font-weight: normal; + } + td { + padding-bottom: 1em; + } + + .required th:after { + content: " *"; + } + + .errorlist { + color: red; + margin: 0; + padding: 0; + list-style: none; + } + .helptext { + color: #888; + font-size: .9em; + font-style: italic; + } +} diff --git a/apps/wolnelektury_core/static/css/header.css b/apps/wolnelektury_core/static/css/header.css index 633e8bde8..f1bd0df94 100755 --- a/apps/wolnelektury_core/static/css/header.css +++ b/apps/wolnelektury_core/static/css/header.css @@ -25,6 +25,9 @@ color: #989898; } +#logo a, #logo img { + display: block; +} #tagline { margin-left: 1.5em; diff --git a/apps/wolnelektury_core/static/css/main_page.css b/apps/wolnelektury_core/static/css/main_page.css index 3db1655b7..a53b9de5e 100755 --- a/apps/wolnelektury_core/static/css/main_page.css +++ b/apps/wolnelektury_core/static/css/main_page.css @@ -10,6 +10,7 @@ } #promo-box-header h2 { font-size: 1.3em; + margin: 0; } #promo-box-body { border-bottom: 2px solid #efefef; @@ -45,6 +46,8 @@ padding-top: 1.9em; height: 3.2em; padding-left: 1.9em; + margin: 0; + font-size: 1em; } .main-last span { font-size: 1.1em; @@ -63,6 +66,8 @@ color: #017e85; height: 2.8em; padding-top: 2.5em; + font-size: 1em; + margin: 0; } .infopages-box h2 span { font-size: 1.1em; diff --git a/apps/wolnelektury_core/static/img/progress-pixel.png b/apps/wolnelektury_core/static/img/progress-pixel.png new file mode 100644 index 000000000..5af1bfdfe Binary files /dev/null and b/apps/wolnelektury_core/static/img/progress-pixel.png differ diff --git a/apps/wolnelektury_core/static/img/social/bigfacebook.png b/apps/wolnelektury_core/static/img/social/bigfacebook.png new file mode 100644 index 000000000..630416cf2 Binary files /dev/null and b/apps/wolnelektury_core/static/img/social/bigfacebook.png differ diff --git a/apps/wolnelektury_core/static/img/social/biggoogle.png b/apps/wolnelektury_core/static/img/social/biggoogle.png new file mode 100644 index 000000000..19ad19df5 Binary files /dev/null and b/apps/wolnelektury_core/static/img/social/biggoogle.png differ diff --git a/apps/wolnelektury_core/static/img/social/bignk.png b/apps/wolnelektury_core/static/img/social/bignk.png new file mode 100644 index 000000000..c119cd117 Binary files /dev/null and b/apps/wolnelektury_core/static/img/social/bignk.png differ diff --git a/apps/wolnelektury_core/static/img/social/bigtwitter.png b/apps/wolnelektury_core/static/img/social/bigtwitter.png new file mode 100644 index 000000000..fafbe6412 Binary files /dev/null and b/apps/wolnelektury_core/static/img/social/bigtwitter.png differ diff --git a/apps/wolnelektury_core/templates/superbase.html b/apps/wolnelektury_core/templates/superbase.html index 182d2b096..2aa653a7e 100644 --- a/apps/wolnelektury_core/templates/superbase.html +++ b/apps/wolnelektury_core/templates/superbase.html @@ -2,7 +2,7 @@ {% load cache compressed i18n %} {% load static from staticfiles %} - {% load catalogue_tags reporting_stats sponsor_tags %} + {% load catalogue_tags funding_tags reporting_stats sponsor_tags %} @@ -121,9 +121,8 @@ -

    - + {% funding link=1 %}