#2466: Assign books to projects.
authorRadek Czajka <radoslaw.czajka@nowoczesnapolska.org.pl>
Tue, 9 Jul 2013 08:16:41 +0000 (10:16 +0200)
committerRadek Czajka <radoslaw.czajka@nowoczesnapolska.org.pl>
Tue, 9 Jul 2013 08:16:41 +0000 (10:16 +0200)
apps/catalogue/admin.py
apps/catalogue/forms.py
apps/catalogue/locale/pl/LC_MESSAGES/django.mo
apps/catalogue/locale/pl/LC_MESSAGES/django.po
apps/catalogue/migrations/0011_auto__add_project__add_field_book_project.py [new file with mode: 0644]
apps/catalogue/models/__init__.py
apps/catalogue/models/book.py
apps/catalogue/models/project.py [new file with mode: 0755]

index c888a08..7fbacad 100644 (file)
@@ -3,12 +3,13 @@ from django.contrib import admin
 from catalogue import models
 
 class BookAdmin(admin.ModelAdmin):
 from catalogue import models
 
 class BookAdmin(admin.ModelAdmin):
-    list_display = ['title', 'public', '_published', '_new_publishable']
-    list_filter = ['public', '_published', '_new_publishable']
+    list_display = ['title', 'public', '_published', '_new_publishable', 'project']
+    list_filter = ['public', '_published', '_new_publishable', 'project']
     prepopulated_fields = {'slug': ['title']}
     search_fields = ['title']
 
 
     prepopulated_fields = {'slug': ['title']}
     search_fields = ['title']
 
 
+admin.site.register(models.Project)
 admin.site.register(models.Book, BookAdmin)
 admin.site.register(models.Chunk)
 
 admin.site.register(models.Book, BookAdmin)
 admin.site.register(models.Chunk)
 
index f70dc47..7ae7ff4 100644 (file)
@@ -20,7 +20,7 @@ class DocumentCreateForm(forms.ModelForm):
 
     class Meta:
         model = Book
 
     class Meta:
         model = Book
-        exclude = ['parent', 'parent_number']
+        exclude = ['parent', 'parent_number', 'project']
 
     def __init__(self, *args, **kwargs):
         super(DocumentCreateForm, self).__init__(*args, **kwargs)
 
     def __init__(self, *args, **kwargs):
         super(DocumentCreateForm, self).__init__(*args, **kwargs)
@@ -130,6 +130,7 @@ class BookForm(forms.ModelForm):
 
     class Meta:
         model = Book
 
     class Meta:
         model = Book
+        exclude = ['project']
 
     def __init__(self, *args, **kwargs):
         ret = super(BookForm, self).__init__(*args, **kwargs)
 
     def __init__(self, *args, **kwargs):
         ret = super(BookForm, self).__init__(*args, **kwargs)
index 743dc5e..fa4fb65 100644 (file)
Binary files a/apps/catalogue/locale/pl/LC_MESSAGES/django.mo and b/apps/catalogue/locale/pl/LC_MESSAGES/django.mo differ
index b3d1b8e..9700619 100644 (file)
@@ -7,15 +7,18 @@ msgid ""
 msgstr ""
 "Project-Id-Version: Platforma Redakcyjna\n"
 "Report-Msgid-Bugs-To: \n"
 msgstr ""
 "Project-Id-Version: Platforma Redakcyjna\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2013-03-07 16:25+0100\n"
-"PO-Revision-Date: 2013-03-07 16:26+0100\n"
+"POT-Creation-Date: 2013-07-09 10:15+0200\n"
+"PO-Revision-Date: 2013-07-09 10:15+0100\n"
 "Last-Translator: Radek Czajka <radoslaw.czajka@nowoczesnapolska.org.pl>\n"
 "Last-Translator: Radek Czajka <radoslaw.czajka@nowoczesnapolska.org.pl>\n"
-"Language-Team: Fundacja Nowoczesna Polska <fundacja@nowoczesnapolska.org.pl>\n"
+"Language-Team: Fundacja Nowoczesna Polska <fundacja@nowoczesnapolska.org."
+"pl>\n"
 "Language: pl\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
 "Language: pl\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"
+"Plural-Forms: nplurals=3; plural=(n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 "
+"|| n%100>=20) ? 1 : 2);\n"
+"X-Generator: Poedit 1.5.4\n"
 
 #: forms.py:39
 msgid "Text file must be UTF-8 encoded."
 
 #: forms.py:39
 msgid "Text file must be UTF-8 encoded."
@@ -37,8 +40,7 @@ msgstr "Katalogi zawierają dokumenty w częściach"
 msgid "Assigned to"
 msgstr "Przypisane do"
 
 msgid "Assigned to"
 msgstr "Przypisane do"
 
-#: forms.py:97
-#: forms.py:111
+#: forms.py:97 forms.py:111
 msgid "Chunk with this slug already exists"
 msgstr "Część z tym slugiem już istnieje"
 
 msgid "Chunk with this slug already exists"
 msgstr "Część z tym slugiem już istnieje"
 
@@ -59,22 +61,19 @@ msgstr "Dokument o tym slugu już istnieje w repozytorium."
 msgid "File should be UTF-8 encoded."
 msgstr "Plik powinien mieć kodowanie UTF-8."
 
 msgid "File should be UTF-8 encoded."
 msgstr "Plik powinien mieć kodowanie UTF-8."
 
-#: views.py:484
-#: models/book.py:55
+#: views.py:487 models/book.py:56
 msgid "books"
 msgstr "książki"
 
 msgid "books"
 msgstr "książki"
 
-#: views.py:486
+#: views.py:489
 msgid "scan gallery"
 msgstr "galeria skanów"
 
 msgid "scan gallery"
 msgstr "galeria skanów"
 
-#: models/book.py:28
-#: models/chunk.py:23
+#: models/book.py:28 models/chunk.py:23
 msgid "title"
 msgstr "tytuł"
 
 msgid "title"
 msgstr "tytuł"
 
-#: models/book.py:29
-#: models/chunk.py:24
+#: models/book.py:29 models/chunk.py:24
 msgid "slug"
 msgstr "slug"
 
 msgid "slug"
 msgstr "slug"
 
@@ -86,41 +85,39 @@ msgstr "publiczna"
 msgid "scan gallery name"
 msgstr "nazwa galerii skanów"
 
 msgid "scan gallery name"
 msgstr "nazwa galerii skanów"
 
-#: models/book.py:34
+#: models/book.py:35
 msgid "parent"
 msgstr "rodzic"
 
 msgid "parent"
 msgstr "rodzic"
 
-#: models/book.py:35
+#: models/book.py:36
 msgid "parent number"
 msgstr "numeracja rodzica"
 
 msgid "parent number"
 msgstr "numeracja rodzica"
 
-#: models/book.py:54
-#: models/chunk.py:21
-#: models/publish_log.py:17
+#: models/book.py:55 models/chunk.py:21 models/publish_log.py:17
 msgid "book"
 msgstr "książka"
 
 msgid "book"
 msgstr "książka"
 
-#: models/book.py:254
+#: models/book.py:255
 msgid "No chunks in the book."
 msgstr "Książka nie ma części."
 
 msgid "No chunks in the book."
 msgstr "Książka nie ma części."
 
-#: models/book.py:258
+#: models/book.py:259
 msgid "Not all chunks have publishable revisions."
 msgstr "Niektóre części nie są gotowe do publikacji."
 
 msgid "Not all chunks have publishable revisions."
 msgstr "Niektóre części nie są gotowe do publikacji."
 
-#: models/book.py:265
+#: models/book.py:266
 msgid "Invalid XML"
 msgstr "Nieprawidłowy XML"
 
 msgid "Invalid XML"
 msgstr "Nieprawidłowy XML"
 
-#: models/book.py:267
+#: models/book.py:268
 msgid "No Dublin Core found."
 msgstr "Brak sekcji Dublin Core."
 
 msgid "No Dublin Core found."
 msgstr "Brak sekcji Dublin Core."
 
-#: models/book.py:269
+#: models/book.py:270
 msgid "Invalid Dublin Core"
 msgstr "Nieprawidłowy Dublin Core"
 
 msgid "Invalid Dublin Core"
 msgstr "Nieprawidłowy Dublin Core"
 
-#: models/book.py:272
+#: models/book.py:273
 msgid "rdf:about is not"
 msgstr "rdf:about jest różny od"
 
 msgid "rdf:about is not"
 msgstr "rdf:about jest różny od"
 
@@ -140,17 +137,31 @@ msgstr "część"
 msgid "chunks"
 msgstr "części"
 
 msgid "chunks"
 msgstr "części"
 
+#: models/project.py:13
+msgid "name"
+msgstr "nazwa"
+
+#: models/project.py:14
+msgid "notes"
+msgstr "notatki"
+
+#: models/project.py:19
+msgid "project"
+msgstr "projekt"
+
+#: models/project.py:20
+msgid "projects"
+msgstr "projekty"
+
 #: models/publish_log.py:18
 msgid "time"
 msgstr "czas"
 
 #: models/publish_log.py:18
 msgid "time"
 msgstr "czas"
 
-#: models/publish_log.py:19
-#: templates/catalogue/wall.html:18
+#: models/publish_log.py:19 templates/catalogue/wall.html:18
 msgid "user"
 msgstr "użytkownik"
 
 msgid "user"
 msgstr "użytkownik"
 
-#: models/publish_log.py:24
-#: models/publish_log.py:33
+#: models/publish_log.py:24 models/publish_log.py:33
 msgid "book publish record"
 msgstr "zapis publikacji książki"
 
 msgid "book publish record"
 msgstr "zapis publikacji książki"
 
@@ -170,8 +181,7 @@ msgstr "zapis publikacji części"
 msgid "chunk publish records"
 msgstr "zapisy publikacji części"
 
 msgid "chunk publish records"
 msgstr "zapisy publikacji części"
 
-#: templates/catalogue/activity.html:9
-#: templatetags/catalogue.py:29
+#: templates/catalogue/activity.html:9 templatetags/catalogue.py:29
 msgid "Activity"
 msgstr "Aktywność"
 
 msgid "Activity"
 msgstr "Aktywność"
 
@@ -184,65 +194,63 @@ msgid "Append book"
 msgstr "Dołącz książkę"
 
 #: templates/catalogue/book_detail.html:14
 msgstr "Dołącz książkę"
 
 #: templates/catalogue/book_detail.html:14
-#: templates/catalogue/book_edit.html:9
-#: templates/catalogue/chunk_edit.html:12
+#: templates/catalogue/book_edit.html:9 templates/catalogue/chunk_edit.html:12
 msgid "Save"
 msgstr "Zapisz"
 
 msgid "Save"
 msgstr "Zapisz"
 
-#: templates/catalogue/book_detail.html:20
+#: templates/catalogue/book_detail.html:21
 msgid "Edit gallery"
 msgstr "Edytuj galerię"
 
 msgid "Edit gallery"
 msgstr "Edytuj galerię"
 
-#: templates/catalogue/book_detail.html:22
+#: templates/catalogue/book_detail.html:24
 msgid "Append to other book"
 msgstr "Dołącz do innej książki"
 
 msgid "Append to other book"
 msgstr "Dołącz do innej książki"
 
-#: templates/catalogue/book_detail.html:28
+#: templates/catalogue/book_detail.html:30
 msgid "Chunks"
 msgstr "Części"
 
 msgid "Chunks"
 msgstr "Części"
 
-#: templates/catalogue/book_detail.html:43
-#: templatetags/wall.py:78
+#: templates/catalogue/book_detail.html:45 templatetags/wall.py:78
 msgid "Publication"
 msgstr "Publikacja"
 
 msgid "Publication"
 msgstr "Publikacja"
 
-#: templates/catalogue/book_detail.html:52
+#: templates/catalogue/book_detail.html:54
 msgid "Last published"
 msgstr "Ostatnio opublikowano"
 
 msgid "Last published"
 msgstr "Ostatnio opublikowano"
 
-#: templates/catalogue/book_detail.html:62
+#: templates/catalogue/book_detail.html:64
 msgid "Full XML"
 msgstr "Pełny XML"
 
 msgid "Full XML"
 msgstr "Pełny XML"
 
-#: templates/catalogue/book_detail.html:63
+#: templates/catalogue/book_detail.html:65
 msgid "HTML version"
 msgstr "Wersja HTML"
 
 msgid "HTML version"
 msgstr "Wersja HTML"
 
-#: templates/catalogue/book_detail.html:64
+#: templates/catalogue/book_detail.html:66
 msgid "TXT version"
 msgstr "Wersja TXT"
 
 msgid "TXT version"
 msgstr "Wersja TXT"
 
-#: templates/catalogue/book_detail.html:65
+#: templates/catalogue/book_detail.html:67
 msgid "PDF version"
 msgstr "Wersja PDF"
 
 msgid "PDF version"
 msgstr "Wersja PDF"
 
-#: templates/catalogue/book_detail.html:66
+#: templates/catalogue/book_detail.html:68
 msgid "EPUB version"
 msgstr "Wersja EPUB"
 
 msgid "EPUB version"
 msgstr "Wersja EPUB"
 
-#: templates/catalogue/book_detail.html:79
+#: templates/catalogue/book_detail.html:81
 msgid "Publish"
 msgstr "Opublikuj"
 
 msgid "Publish"
 msgstr "Opublikuj"
 
-#: templates/catalogue/book_detail.html:83
+#: templates/catalogue/book_detail.html:85
 msgid "Log in to publish."
 msgstr "Zaloguj się, aby opublikować."
 
 msgid "Log in to publish."
 msgstr "Zaloguj się, aby opublikować."
 
-#: templates/catalogue/book_detail.html:86
+#: templates/catalogue/book_detail.html:88
 msgid "This book can't be published yet, because:"
 msgstr "Ta książka nie może jeszcze zostać opublikowana. Powód:"
 
 msgid "This book can't be published yet, because:"
 msgstr "Ta książka nie może jeszcze zostać opublikowana. Powód:"
 
-#: templates/catalogue/book_detail.html:96
+#: templates/catalogue/book_detail.html:98
 msgid "Comments"
 msgstr "Komentarze"
 
 msgid "Comments"
 msgstr "Komentarze"
 
@@ -258,8 +266,7 @@ msgstr "Spis treści"
 msgid "Edit. note"
 msgstr "Nota red."
 
 msgid "Edit. note"
 msgstr "Nota red."
 
-#: templates/catalogue/chunk_add.html:5
-#: templates/catalogue/chunk_edit.html:18
+#: templates/catalogue/chunk_add.html:5 templates/catalogue/chunk_edit.html:18
 msgid "Split chunk"
 msgstr "Podziel część"
 
 msgid "Split chunk"
 msgstr "Podziel część"
 
@@ -294,16 +301,20 @@ msgid "Bulk documents upload"
 msgstr "Hurtowe dodawanie dokumentów"
 
 #: templates/catalogue/document_upload.html:11
 msgstr "Hurtowe dodawanie dokumentów"
 
 #: templates/catalogue/document_upload.html:11
-msgid "Please submit a ZIP with UTF-8 encoded XML files. Files not ending with <code>.xml</code> will be ignored."
-msgstr "Proszę wskazać archiwum ZIP z plikami XML w kodowaniu UTF-8. Pliki nie kończące się na <code>.xml</code> zostaną zignorowane."
+msgid ""
+"Please submit a ZIP with UTF-8 encoded XML files. Files not ending with "
+"<code>.xml</code> will be ignored."
+msgstr ""
+"Proszę wskazać archiwum ZIP z plikami XML w kodowaniu UTF-8. Pliki nie "
+"kończące się na <code>.xml</code> zostaną zignorowane."
 
 
-#: templates/catalogue/document_upload.html:17
-#: templatetags/catalogue.py:35
+#: templates/catalogue/document_upload.html:17 templatetags/catalogue.py:35
 msgid "Upload"
 msgstr "Załaduj"
 
 #: templates/catalogue/document_upload.html:24
 msgid "Upload"
 msgstr "Załaduj"
 
 #: templates/catalogue/document_upload.html:24
-msgid "There have been some errors. No files have been added to the repository."
+msgid ""
+"There have been some errors. No files have been added to the repository."
 msgstr "Wystąpiły błędy. Żadne pliki nie zostały dodane do repozytorium."
 
 #: templates/catalogue/document_upload.html:25
 msgstr "Wystąpiły błędy. Żadne pliki nie zostały dodane do repozytorium."
 
 #: templates/catalogue/document_upload.html:25
@@ -334,13 +345,11 @@ msgstr "Pliki pominięte z powodu braku rozszerzenia <code>.xml</code>."
 msgid "Your last edited documents"
 msgstr "Twoje ostatnie edycje"
 
 msgid "Your last edited documents"
 msgstr "Twoje ostatnie edycje"
 
-#: templates/catalogue/my_page.html:30
-#: templates/catalogue/user_page.html:13
+#: templates/catalogue/my_page.html:30 templates/catalogue/user_page.html:13
 msgid "Recent activity for"
 msgstr "Ostatnia aktywność dla:"
 
 msgid "Recent activity for"
 msgstr "Ostatnia aktywność dla:"
 
-#: templates/catalogue/user_list.html:7
-#: templatetags/catalogue.py:31
+#: templates/catalogue/user_list.html:7 templatetags/catalogue.py:31
 msgid "Users"
 msgstr "Użytkownicy"
 
 msgid "Users"
 msgstr "Użytkownicy"
 
@@ -522,9 +531,6 @@ msgstr "Komentarz"
 #~ msgid "Describe the reason for reverting."
 #~ msgstr "Opisz powód przywrócenia."
 
 #~ msgid "Describe the reason for reverting."
 #~ msgstr "Opisz powód przywrócenia."
 
-#~ msgid "name"
-#~ msgstr "nazwa"
-
 #~ msgid "theme"
 #~ msgstr "motyw"
 
 #~ msgid "theme"
 #~ msgstr "motyw"
 
diff --git a/apps/catalogue/migrations/0011_auto__add_project__add_field_book_project.py b/apps/catalogue/migrations/0011_auto__add_project__add_field_book_project.py
new file mode 100644 (file)
index 0000000..6f30cb4
--- /dev/null
@@ -0,0 +1,159 @@
+# -*- 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 'Project'
+        db.create_table(u'catalogue_project', (
+            (u'id', self.gf('django.db.models.fields.AutoField')(primary_key=True)),
+            ('name', self.gf('django.db.models.fields.CharField')(unique=True, max_length=255)),
+            ('notes', self.gf('django.db.models.fields.TextField')(null=True, blank=True)),
+        ))
+        db.send_create_signal('catalogue', ['Project'])
+
+        # Adding field 'Book.project'
+        db.add_column(u'catalogue_book', 'project',
+                      self.gf('django.db.models.fields.related.ForeignKey')(to=orm['catalogue.Project'], null=True),
+                      keep_default=False)
+
+
+    def backwards(self, orm):
+        # Deleting model 'Project'
+        db.delete_table(u'catalogue_project')
+
+        # Deleting field 'Book.project'
+        db.delete_column(u'catalogue_book', 'project_id')
+
+
+    models = {
+        u'auth.group': {
+            'Meta': {'object_name': 'Group'},
+            u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '80'}),
+            'permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': u"orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'})
+        },
+        u'auth.permission': {
+            'Meta': {'ordering': "(u'content_type__app_label', u'content_type__model', u'codename')", 'unique_together': "((u'content_type', u'codename'),)", 'object_name': 'Permission'},
+            'codename': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
+            'content_type': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['contenttypes.ContentType']"}),
+            u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'name': ('django.db.models.fields.CharField', [], {'max_length': '50'})
+        },
+        u'auth.user': {
+            'Meta': {'object_name': 'User'},
+            'date_joined': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}),
+            'email': ('django.db.models.fields.EmailField', [], {'max_length': '75', 'blank': 'True'}),
+            'first_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}),
+            'groups': ('django.db.models.fields.related.ManyToManyField', [], {'to': u"orm['auth.Group']", 'symmetrical': 'False', 'blank': 'True'}),
+            u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'is_active': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
+            'is_staff': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
+            'is_superuser': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
+            'last_login': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}),
+            'last_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}),
+            'password': ('django.db.models.fields.CharField', [], {'max_length': '128'}),
+            'user_permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': u"orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'}),
+            'username': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '30'})
+        },
+        'catalogue.book': {
+            'Meta': {'ordering': "['title', 'slug']", 'object_name': 'Book'},
+            '_new_publishable': ('django.db.models.fields.NullBooleanField', [], {'null': 'True', 'blank': 'True'}),
+            '_on_track': ('django.db.models.fields.IntegerField', [], {'db_index': 'True', 'null': 'True', 'blank': 'True'}),
+            '_published': ('django.db.models.fields.NullBooleanField', [], {'null': 'True', 'blank': 'True'}),
+            '_short_html': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}),
+            '_single': ('django.db.models.fields.NullBooleanField', [], {'db_index': 'True', 'null': 'True', 'blank': 'True'}),
+            'dc_cover_image': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['cover.Image']", 'null': 'True', 'on_delete': 'models.SET_NULL', 'blank': 'True'}),
+            'dc_slug': ('django.db.models.fields.CharField', [], {'db_index': 'True', 'max_length': '128', 'null': 'True', 'blank': 'True'}),
+            'gallery': ('django.db.models.fields.CharField', [], {'max_length': '255', 'blank': 'True'}),
+            u'id': ('django.db.models.fields.AutoField', [], {'primary_key': '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', [], {'db_index': 'True', 'null': 'True', 'blank': 'True'}),
+            'project': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['catalogue.Project']", 'null': 'True'}),
+            'public': ('django.db.models.fields.BooleanField', [], {'default': 'True', 'db_index': 'True'}),
+            'slug': ('django.db.models.fields.SlugField', [], {'unique': 'True', 'max_length': '128'}),
+            'title': ('django.db.models.fields.CharField', [], {'max_length': '255', 'db_index': 'True'})
+        },
+        'catalogue.bookpublishrecord': {
+            'Meta': {'ordering': "['-timestamp']", 'object_name': 'BookPublishRecord'},
+            'book': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'publish_log'", 'to': "orm['catalogue.Book']"}),
+            u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'timestamp': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}),
+            'user': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['auth.User']"})
+        },
+        'catalogue.chunk': {
+            'Meta': {'ordering': "['number']", 'unique_together': "[['book', 'number'], ['book', 'slug']]", 'object_name': 'Chunk'},
+            '_changed': ('django.db.models.fields.NullBooleanField', [], {'null': 'True', 'blank': 'True'}),
+            '_hidden': ('django.db.models.fields.NullBooleanField', [], {'null': 'True', 'blank': 'True'}),
+            '_short_html': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}),
+            'book': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['catalogue.Book']"}),
+            'creator': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'created_chunk'", 'null': 'True', 'to': u"orm['auth.User']"}),
+            'gallery_start': ('django.db.models.fields.IntegerField', [], {'default': '1', 'null': 'True', 'blank': 'True'}),
+            'head': ('django.db.models.fields.related.ForeignKey', [], {'default': 'None', 'to': "orm['catalogue.ChunkChange']", 'null': 'True', 'blank': 'True'}),
+            u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'number': ('django.db.models.fields.IntegerField', [], {}),
+            'slug': ('django.db.models.fields.SlugField', [], {'max_length': '50'}),
+            'stage': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['catalogue.ChunkTag']", 'null': 'True', 'blank': 'True'}),
+            'title': ('django.db.models.fields.CharField', [], {'max_length': '255', 'blank': 'True'}),
+            'user': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['auth.User']", 'null': 'True', 'blank': 'True'})
+        },
+        'catalogue.chunkchange': {
+            'Meta': {'ordering': "('created_at',)", 'unique_together': "(['tree', 'revision'],)", 'object_name': 'ChunkChange'},
+            'author': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['auth.User']", 'null': 'True', 'blank': 'True'}),
+            'author_email': ('django.db.models.fields.CharField', [], {'max_length': '128', 'null': 'True', 'blank': 'True'}),
+            'author_name': ('django.db.models.fields.CharField', [], {'max_length': '128', 'null': 'True', 'blank': 'True'}),
+            'created_at': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now', 'db_index': 'True'}),
+            'data': ('django.db.models.fields.files.FileField', [], {'max_length': '100'}),
+            'description': ('django.db.models.fields.TextField', [], {'default': "''", 'blank': 'True'}),
+            u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'merge_parent': ('django.db.models.fields.related.ForeignKey', [], {'default': 'None', 'related_name': "'merge_children'", 'null': 'True', 'blank': 'True', 'to': "orm['catalogue.ChunkChange']"}),
+            'parent': ('django.db.models.fields.related.ForeignKey', [], {'default': 'None', 'related_name': "'children'", 'null': 'True', 'blank': 'True', 'to': "orm['catalogue.ChunkChange']"}),
+            'publishable': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
+            'revision': ('django.db.models.fields.IntegerField', [], {'db_index': 'True'}),
+            'tags': ('django.db.models.fields.related.ManyToManyField', [], {'related_name': "'change_set'", 'symmetrical': 'False', 'to': "orm['catalogue.ChunkTag']"}),
+            'tree': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'change_set'", 'to': "orm['catalogue.Chunk']"})
+        },
+        'catalogue.chunkpublishrecord': {
+            'Meta': {'object_name': 'ChunkPublishRecord'},
+            'book_record': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['catalogue.BookPublishRecord']"}),
+            'change': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'publish_log'", 'to': "orm['catalogue.ChunkChange']"}),
+            u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'})
+        },
+        'catalogue.chunktag': {
+            'Meta': {'ordering': "['ordering']", 'object_name': 'ChunkTag'},
+            u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'name': ('django.db.models.fields.CharField', [], {'max_length': '64'}),
+            'ordering': ('django.db.models.fields.IntegerField', [], {}),
+            'slug': ('django.db.models.fields.SlugField', [], {'max_length': '64', 'unique': 'True', 'null': 'True', 'blank': 'True'})
+        },
+        'catalogue.project': {
+            'Meta': {'ordering': "['name']", 'object_name': 'Project'},
+            u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '255'}),
+            'notes': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'})
+        },
+        u'contenttypes.contenttype': {
+            'Meta': {'ordering': "('name',)", 'unique_together': "(('app_label', 'model'),)", 'object_name': 'ContentType', 'db_table': "'django_content_type'"},
+            'app_label': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
+            u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'model': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
+            'name': ('django.db.models.fields.CharField', [], {'max_length': '100'})
+        },
+        u'cover.image': {
+            'Meta': {'object_name': 'Image'},
+            'author': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
+            'download_url': ('django.db.models.fields.URLField', [], {'unique': 'True', 'max_length': '200'}),
+            'file': ('django.db.models.fields.files.ImageField', [], {'max_length': '100'}),
+            u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'license_name': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
+            'license_url': ('django.db.models.fields.URLField', [], {'max_length': '255', 'blank': 'True'}),
+            'source_url': ('django.db.models.fields.URLField', [], {'max_length': '200'}),
+            'title': ('django.db.models.fields.CharField', [], {'max_length': '255'})
+        }
+    }
+
+    complete_apps = ['catalogue']
\ No newline at end of file
index 6161807..bd069f1 100755 (executable)
@@ -3,6 +3,7 @@
 # This file is part of FNP-Redakcja, licensed under GNU Affero GPLv3 or later.
 # Copyright © Fundacja Nowoczesna Polska. See NOTICE for more information.
 #
 # This file is part of FNP-Redakcja, licensed under GNU Affero GPLv3 or later.
 # Copyright © Fundacja Nowoczesna Polska. See NOTICE for more information.
 #
+from catalogue.models.project import Project
 from catalogue.models.chunk import Chunk
 from catalogue.models.publish_log import BookPublishRecord, ChunkPublishRecord
 from catalogue.models.book import Book
 from catalogue.models.chunk import Chunk
 from catalogue.models.publish_log import BookPublishRecord, ChunkPublishRecord
 from catalogue.models.book import Book
index 4d1b12e..b1b2730 100755 (executable)
@@ -13,7 +13,7 @@ from slughifi import slughifi
 
 import apiclient
 from catalogue.helpers import cached_in_field, GalleryMerger
 
 import apiclient
 from catalogue.helpers import cached_in_field, GalleryMerger
-from catalogue.models import BookPublishRecord, ChunkPublishRecord
+from catalogue.models import BookPublishRecord, ChunkPublishRecord, Project
 from catalogue.signals import post_publish
 from catalogue.tasks import refresh_instance, book_content_updated
 from catalogue.xml_tools import compile_text, split_xml
 from catalogue.signals import post_publish
 from catalogue.tasks import refresh_instance, book_content_updated
 from catalogue.xml_tools import compile_text, split_xml
@@ -29,6 +29,7 @@ class Book(models.Model):
     slug = models.SlugField(_('slug'), max_length=128, unique=True, db_index=True)
     public = models.BooleanField(_('public'), default=True, db_index=True)
     gallery = models.CharField(_('scan gallery name'), max_length=255, blank=True)
     slug = models.SlugField(_('slug'), max_length=128, unique=True, db_index=True)
     public = models.BooleanField(_('public'), default=True, db_index=True)
     gallery = models.CharField(_('scan gallery name'), max_length=255, blank=True)
+    project = models.ForeignKey(Project, null=True)
 
     #wl_slug = models.CharField(_('title'), max_length=255, null=True, db_index=True, editable=False)
     parent = models.ForeignKey('self', null=True, blank=True, verbose_name=_('parent'), related_name="children", editable=False)
 
     #wl_slug = models.CharField(_('title'), max_length=255, null=True, db_index=True, editable=False)
     parent = models.ForeignKey('self', null=True, blank=True, verbose_name=_('parent'), related_name="children", editable=False)
diff --git a/apps/catalogue/models/project.py b/apps/catalogue/models/project.py
new file mode 100755 (executable)
index 0000000..eb95102
--- /dev/null
@@ -0,0 +1,23 @@
+# -*- coding: utf-8 -*-
+#
+# This file is part of FNP-Redakcja, licensed under GNU Affero GPLv3 or later.
+# Copyright © Fundacja Nowoczesna Polska. See NOTICE for more information.
+#
+from django.db import models
+from django.utils.translation import ugettext_lazy as _
+
+
+class Project(models.Model):
+    """ A project, tracked for funding purposes. """
+
+    name = models.CharField(_('name'), max_length=255, unique=True)
+    notes = models.TextField(_('notes'), blank=True, null=True)
+
+    class Meta:
+        app_label = 'catalogue'
+        ordering = ['name']
+        verbose_name = _('project')
+        verbose_name_plural = _('projects')
+
+    def __unicode__(self):
+        return self.name